键盘在出现时的高度会有所变化。
键盘在出现时的高度会有所变化。
我试图通过修改底部约束来在键盘出现时提高我的观点,但是返回给我的键盘高度是不固定的。
当我在模拟器中点击一个文本框时,键盘高度是302
。当我尝试打开和关闭软键盘时,键盘出现时显示为260
。为什么会这样呢?
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(FriendsViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
func keyboardWillShow(notification: NSNotification) {
print("键盘出现")
guard let keyboardHeight = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameBeginUserInfoKey)?.CGRectValue.size.height else {
return
}
bottomConstraint.constant = keyboardHeight
print("键盘高度: \(keyboardHeight)")
self.view.layoutIfNeeded()
}
260
的高度实际上是正确的高度,因为它能完美调整我的观点。用302
的高度,我的观点会偏移得太高。
我的视图布局是:顶部是UITextField
,下面是一个UITableView
。
问题的原因是代码中使用了错误的键盘高度参数。应该使用UIKeyboardFrameEndUserInfoKey
来获取键盘的高度。
代码中还存在其他问题。需要将窗口坐标转换为本地坐标,并且不能假设键盘的高度,而应该查看键盘顶部的位置。
解决方法是使用UIKeyboardFrameEndUserInfoKey
来获取键盘高度,并将窗口坐标转换为本地坐标。同时,查看键盘顶部的位置来确定键盘的高度。
以下是正确的代码示例:
func keyboardWillShow(notification: NSNotification) {
if let keyboardFrame = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect {
let keyboardFrameInView = view.convert(keyboardFrame, from: nil)
let keyboardHeight = view.bounds.height - keyboardFrameInView.origin.y
// Use the keyboardHeight variable for further calculations or adjustments
}
}
通过以上代码,可以正确获取键盘的高度,并进行后续的计算或调整操作。
问题出现的原因是,使用了错误的键(UIKeyboardFrameBeginUserInfoKey)来获取键盘的高度。正确的键是UIKeyboardFrameEndUserInfoKey,因为它会根据用户设置的偏好返回最终的高度。
解决方法是使用UIKeyboardFrameEndUserInfoKey来获取键盘的高度。此外,需要注意的是,UIKeyboardFrameEndUserInfoKey返回的高度会有两个值,第一个是没有语言预测的高度,第二个是启用了语言预测的高度。而UIKeyboardFrameBeginUserInfoKey只返回没有预测栏的高度。
对于在iPhone 5s上切换键盘时的高度问题,可以参考下面的图片。当点击UITextField时,在iPhone 7上仍然显示较大的高度(302),只有在切换软键盘的时候才能正确显示高度(260)。
文章中还提到了在模拟器中切换软键盘时获得的高度值(216和253),但实际上用户点击UITextField时返回的高度是错误的。
然而,正确的高度应该是302,而不是260。确保使用的是UIKeyboardFrameEndUserInfoKey来获取高度。
作者表示,返回的高度是302,这是不正确的。视图使用260来正确调整,而302太高了。
最后,作者指出在其项目中实现了相同的功能,并且正常工作。
当键盘出现时,键盘的高度可能会有所变化。这可能是因为用户在不同的设备上使用不同的键盘,或者用户在键盘上切换输入法时键盘的高度发生变化。
为了解决这个问题,可以使用以下方法:
1. 首先,在 Swift 2 中添加一个函数:animateViewMoving
,用于将视图上移或下移。
// 上移视图
func animateViewMoving(up: Bool, moveValue: CGFloat) {
let movementDuration: NSTimeInterval = 0.3
let movement: CGFloat = (up ? -moveValue : moveValue)
UIView.beginAnimations("animateView", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)
self.view.frame = CGRectOffset(self.view.frame, 0, movement)
UIView.commitAnimations()
}
2. 然后实现 UITextFieldDelegate
协议,以便在文本框的各种事件中调用 animateViewMoving
函数。
// MARK: - UITextFieldDelegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
// 隐藏键盘
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField: UITextField) {
// 当文本框结束编辑时,将视图下移
animateViewMoving(false, moveValue: 100)
textField.resignFirstResponder()
}
func textFieldDidBeginEditing(textField: UITextField) {
// 当文本框开始编辑时,将视图上移
animateViewMoving(true, moveValue: 100)
}
3. 可以通过以下方法获取键盘的准确高度:
var viewLiftUpValue: CGFloat
func keyboardWillShow(notification: NSNotification) {
let userInfo: NSDictionary = notification.userInfo!
let keyboardFrame: NSValue = userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue
let keyboardRectangle = keyboardFrame.CGRectValue()
let keyboardHeight = keyboardRectangle.height
viewLiftUpValue = keyboardHeight
}
4. 然后将获取到的键盘高度传递给 animateViewMoving
函数。