在键盘显示或隐藏时调整 UIView

Adjusting a UIView when the keyboard shows or hides

我正在添加一个键盘观察器来调整键盘显示时的视图高度。但是当文本字段位于视图的顶部并且键盘显示时,文本字段会上升得更多。有人可以指导我如何正确解决此问题,因为在执行大量搜索后,他们都提出了同样的建议。我在 iPhone 5.

上使用 iOS 9

这是我的代码。在 viewDidLoad():

//SET OBSERVER WHEN KEYBOARD IS SHOWN
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: self.view.window)

//SET OBSERVER WHEN KEYBOARD IS HIDDEN
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: self.view.window)

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)
}

//HANDLING KEYBOARD APPEARING AND DISAPPEARING
func keyboardWillHide(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    self.view.frame.origin.y += keyboardSize.height
}

func keyboardWillShow(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    print(("\(keyboardSize.height)---\(offset.height)"))  **//this is always showing the values 216.0 for both** 

    if keyboardSize.height == offset.height {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y -= keyboardSize.height
        })
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
}

您对不是很困难的问题采用了复杂的方法。请记住,手机有多种尺寸,因此尝试移动视图可能对一个设备(例如 iPhone 5)很有效,但对其他设备(例如 iPhone 4,iPhone6s).

您正在寻找的解决方案是将控件放在 UIScrollView 中。然后,当键盘显示或隐藏时,您不要移动 任何东西 – 您只需调整滚动视图的内容插入,然后让 iOS 完成其余的工作。

显示和隐藏的键盘比较复杂,因为还有可以随意连接和拔出的硬件键盘;在我的(极其广泛的!)测试中,我设法将似乎在所有条件下都能正常运行的代码组合在一起,无论键盘发生什么情况。我已经尝试 trim 将它缩小,并且总是发现它停止工作的边缘情况,所以我已经解决了这个固定的方法并且效果很好。如果您能够使用 UIScrollView,这种方法也适用于您。

第 1 步:注册以获得正确的通知。具体来说,将其放入 viewDidLoad():

let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: "adjustForKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
notificationCenter.addObserver(self, selector: "adjustForKeyboard:", name: UIKeyboardWillChangeFrameNotification, object: nil)

步骤 2:将此方法添加到您的视图控制器:

func adjustForKeyboard(notification: NSNotification) {
    let userInfo = notification.userInfo!

    let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
    let keyboardViewEndFrame = view.convertRect(keyboardScreenEndFrame, fromView: view.window)

    if notification.name == UIKeyboardWillHideNotification {
        yourScrollView.contentInset = UIEdgeInsetsZero
    } else {
        yourScrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardViewEndFrame.height, right: 0)
    }

    yourScrollView.scrollIndicatorInsets = yourScrollView.contentInset
}

第 3 步: 使用 UITextView 的任何人还应该将这两行添加到该方法的末尾,这样用户就不会丢失他们的位置:

let selectedRange = yourScrollView.selectedRange
yourScrollView.scrollRangeToVisible(selectedRange)

…虽然在那种情况下大概是 yourTextView 或类似的。