下面是我在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
方法。不确定,为什么会这样发生?!
无论如何,更让我着迷的是现在发生的事情。我可以将模式更改为手动压缩,然后再返回展开。如果处于扩展模式,则一旦我点击,键盘就会向上滑动。但是,如果我在紧凑模式下点击,应用程序将崩溃!
而且这种情况一直发生。在模拟器和真实设备上。我没有任何线索可以解释这种行为。
无论我将模式从压缩模式更改为展开模式,还是返回更改模式的次数,我都可以在扩展模式下输入文本。但是,在紧凑模式下,第一次轻击后再也不会发生。
有人遇到这个问题吗?还是可以复制?这是Apple的错误吗?
如果用户在文本字段中点击后需要更改演示样式,则可以添加延迟以确保与过渡之间没有冲突。
开始时最好防止键盘显示(您可能需要在VC中设置bool标志以在textview委托中将其关闭以启用此功能,然后调用),>
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() } }
`
希望这会有所帮助