下面是我在iMessage应用程序中的全部代码。
class MessagesViewController: MSMessagesAppViewController {
@IBOutlet weak var messageView: UITextView!
fileprivate func setupMessageView() {
messageView.delegate = self
messageView.layer.cornerRadius = 10
messageView.layer.borderColor = UIColor.black.cgColor
messageView.layer.borderWidth = 5
messageView.text = "Tap to enter a message"
messageView.textColor = UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0)
messageView.textAlignment = .center
messageView.font = UIFont.systemFont(ofSize: 20)
messageView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}
func initialize() {
setupMessageView()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.initialize), userInfo: nil, repeats: false)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Conversation Handling
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
// Use this method to configure the extension and restore previously stored state.
}
override func didResignActive(with conversation: MSConversation) {
// Called when the extension is about to move from the active to inactive state.
// This will happen when the user dissmises the extension, changes to a different
// conversation or quits Messages.
// Use this method to release shared resources, save user data, invalidate timers,
// and store enough state information to restore your extension to its current state
// in case it is terminated later.
}
override func didReceive(_ message: MSMessage, conversation: MSConversation) {
// Called when a message arrives that was generated by another instance of this
// extension on a remote device.
// Use this method to trigger UI updates in response to the message.
}
override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
// Called when the user taps the send button.
}
override func didCancelSending(_ message: MSMessage, conversation: MSConversation) {
// Called when the user deletes the message without sending it.
// Use this to clean up state related to the deleted message.
}
override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
// Called before the extension transitions to a new presentation style.
// Use this method to prepare for the change in presentation style.
}
override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
// Called after the extension transitions to a new presentation style.
// Use this method to finalize any behaviors associated with the change in presentation style.
}
}
extension MessagesViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
if textView == messageView {
requestPresentationStyle(.expanded)
if textView.textColor == UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0) {
textView.text = nil
textView.textAlignment = .left
textView.textColor = UIColor.black
textView.font = UIFont.systemFont(ofSize: 20)
}
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if textView == messageView {
if textView.text.isEmpty {
textView.text = "Tap to enter a message"
textView.textAlignment = .center
textView.textColor = UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0)
textView.font = UIFont.systemFont(ofSize: 20)
}
}
}
}
它有一个UITextView
,我尝试输入数据。我在执行此操作时遇到一个奇怪的问题。
在初始加载时,如果我点击UITextView
,则会调用扩展模式,但键盘不会向上滑动。它需要再次点击键盘才能向上滑动。
在日志中,我能够发现,textViewDidBeginEditing
和textViewDidEndEditing
方法在第一次点击时依次调用。不知道,为什么会这样!?
无论如何,更让我感兴趣的是现在发生的事情。我可以手动将模式更改为压缩,然后返回扩展模式。如果在扩展模式下,一旦我点击,键盘就会向上滑动。但是,如果我在紧凑模式下点击,应用程序会崩溃!!
这种情况一直在发生。在模拟器和真实设备上。我没有线索来解释这种行为。
无论我将模式从紧凑更改为展开再更改多少次,我都可以在扩展模式下输入文本。但是,在第一次点击后,在紧凑模式下,它永远不会再发生。
有人有这个问题吗?或者你能复制这个吗?这是苹果的错误吗?
如果需要在用户点击文本字段后更改演示文稿样式,则可以添加延迟以确保不会与过渡发生冲突。
最好最初阻止键盘显示(您可能需要在 VC 中设置一个布尔标志以在文本视图委托中关闭以启用此功能),调用
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
if !shouldShowKeyBoard {
self.requestPresentationStyle(.expanded)
return false
}
return true
然后在 MSMessagesAppViewController 委托中,使键盘成为第一响应者 `
override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
if presentationStyle == .expanded {
shouldShowKeyBoard = true
textView.becomeFirstResponder()
}
}
'
希望这会有所帮助