【问题标题】:UITextField Not Moving to Correct Location with Keyboard LaunchUITextField 没有通过键盘启动移动到正确的位置
【发布时间】:2020-05-08 20:39:55
【问题描述】:

我正在尝试使 UITextField 移动,使其位于键盘顶部(与 iMessage 相同),但无法弄清楚我的问题是什么。我已经审查了与此类似的问题,但到目前为止还没有成功。文本字段似乎略有移动,但最终在键盘后面,所以希望这是一个愚蠢的坐标放置问题,有人可以向我指出。另一件需要注意的事情是,下面的 GIF 是在 iPhone X 上,但是,当我在 iPhone 6 上运行应用程序时,UITextField 会移动到键盘上方的正确位置,但只要我输入任何内容,就会移回它的下方。任何帮助表示赞赏!

class ChatViewController: UIViewController {

@IBOutlet weak var messageView: UIView!
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var textMessageField: UITextField!
@IBOutlet weak var contactStatusLabel: UILabel!
@IBOutlet weak var sendButton: UIButton!
@IBOutlet weak var videoChatButton: UIButton!
let cellID = "cellID"
var contactIsOnline = false
var currentUser:G8User = G8User()
var currentContact:G8User = G8User()
var currentConversation : Conversation?
var videoToken = ""
var allMessages : [ChatMessage] = []
var onlineRef:DatabaseReference!
var incomingMessagesRef:DatabaseReference!


override func viewDidLoad() {
    super.viewDidLoad()
    sendButton.backgroundColor = UIColor(red: CGFloat(0/255), green: CGFloat(137.0/255.0), blue: CGFloat(249.0/255.0), alpha: 1)
    sendButton.layer.cornerRadius = 5
    videoChatButton.backgroundColor = UIColor.red
    videoChatButton.layer.cornerRadius = 5
    collectionView.alwaysBounceVertical = true
    collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
    collectionView.scrollIndicatorInsets = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
    collectionView.register(ChatMessageCell.self, forCellWithReuseIdentifier: cellID)
    collectionView.dataSource = self
    collectionView.delegate = self

    // Used to dismiss keyboard
    let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:)))
    tap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(tap)



    // Set up keyboard observers
    NotificationCenter.default.addObserver(self, selector: #selector(ChatViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ChatViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)


}

 @objc func keyboardWillShow(notification: NSNotification) {
    print("SHOWING KEYBOARD")
     // TODO: Adjust scrolling for message view
     if let keyboardFrame = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue{

        let topOfMessageBox = keyboardFrame.origin.y - self.messageView.frame.height
         self.collectionView.frame = CGRect(x: collectionView.frame.origin.x,y: collectionView.frame.origin.y,width: collectionView.frame.width,height: topOfMessageBox - collectionView.frame.origin.y)
        self.messageView.frame = CGRect(x: messageView.frame.origin.x,y: topOfMessageBox,width: messageView.frame.width, height: messageView.frame.height)


     }
 }

 @objc func keyboardWillHide(notification: NSNotification) {
    print("HIDING KEYBOARD")

    self.collectionView.frame = CGRect(x: collectionView.frame.origin.x,y: collectionView.frame.origin.y,width: collectionView.frame.width,height:  messageView.frame.origin.y - collectionView.frame.origin.y )
    self.messageView.frame = CGRect(x: messageView.frame.origin.x,y: self.view.frame.maxY - messageView.frame.size.height,width: messageView.frame.width,height: messageView.frame.height)
 }

GIF of Issue

【问题讨论】:

    标签: ios swift user-interface uiview uikeyboard


    【解决方案1】:

    试试这个UIView 扩展,类似于myTextField.bindToKeyboard()

    extension UIView {
    
        func bindToKeyboard() {
    
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
        }
    
        @objc func keyboardWillChange(_ notification: NSNotification) {
    
            let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double
            let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt
            let beginningFrame = (notification.userInfo![UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
            let endFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
            var deltaY = endFrame.origin.y - beginningFrame.origin.y
    
            UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {
                self.frame.origin.y += deltaY
            }, completion: nil)
        }
    }
    

    【讨论】:

    • 谢谢你!我真的很喜欢这个实现,但是,同样的问题仍然存在。参考原来的实现:messageView 现在会移动到键盘的顶部,但是每当我点击键盘时,messageView 就会移动到键盘下方的屏幕底部。奇怪的是,keyboardWillHide 或keyboardWillShow 函数都没有被触发,并且我的代码中没有其他部分可以设置messageView 的位置。我不知道是什么原因造成的
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多