iOS 8 出现键盘时 UIView 上移 |问题
Posted
技术标签:
【中文标题】iOS 8 出现键盘时 UIView 上移 |问题【英文标题】:iOS 8 move UIView up when keyboard appears | Issue 【发布时间】:2014-10-08 10:52:58 【问题描述】:我有一个UIView
和一个UITextField
放在屏幕底部,当键盘出现时它会向上移动。
在 ios 8 之前我一直遵循以下方法,并且似乎可以完美运行。
// When Keyboard appears
- (void)keyboardWillShow:(NSNotification *)notification
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey]integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
// Frame Update
CGRect frame = self.bottomView.frame;
frame.origin.y = self.view.frame.size.height - 266.0f;
self.bottomView.frame = frame;
[UIView commitAnimations];
// When keyboard disappears
- (void) keyboardHides : (NSNotification *) notification
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
// Frame update
CGRect frame = self.bottomView.frame;
frame.origin.y = self.view.frame.size.height - self.bottomView.frame.size.height;
self.bottomView.frame = frame;
[UIView commitAnimations];
但上面的代码似乎在iOS 8
中不起作用,因为键盘挡住了它后面的 UIView。
经过一番研究,我找到了almost-similar 的答案。但是这里整个UIView
都被推高了,我想要实现的只是移动bottom UIView
。
【问题讨论】:
你为什么不把所有的东西都放在UIScrollView
上,当键盘出现时向下滚动?
我建议您放弃动画解决方案并在UITextField
上使用inputAccessoryView
。据我所知,这就是你想要做的事情。
@Roma-MT 不想那样做 :)
@Sreejith 然后不要! ;-)
【参考方案1】:
从https://github.com/michaeltyson/TPKeyboardAvoiding获取TPKeyboardAvoidingScrollView
如下使用。
将 TPKeyboardAvoidingScrollView.m 和 TPKeyboardAvoidingScrollView.h 源文件拖放到您的项目中,将 UIScrollView 弹出到视图控制器的 xib 中,将滚动视图的类设置为 TPKeyboardAvoidingScrollView,然后将所有控件放在该滚动视图中。您也可以通过编程方式创建它,而无需使用 xib - 只需使用 TPKeyboardAvoidingScrollView 作为您的***视图。
要禁用自动“下一步”按钮功能,请将 UITextField 的返回键类型更改为 UIReturnKeyDefault 以外的任何类型。
【讨论】:
这个课程包太棒了!它工作得非常好。谢谢!【参考方案2】:我不确定这是否是您的问题,但您应该使用基于块的 API 来为 UIView 设置动画
示例(未测试)
- (void)animateTextField:(UITextField*)textField
up:(BOOL)up
const float movementDuration = 0.5f;
const int movementDistance = 380;
int movement = (up ? -movementDistance : movementDistance);
[UIView animateWithDuration:movementDuration
animations:
^
CGRect frame = self.bottomView.frame;
frame.origin.y = self.view.frame.size.height - 266.0f;
self.bottomView.frame = frame;
];
您可以阅读 Apple 的文档:
不鼓励在 iOS 4.0 及更高版本中使用此方法。你应该使用 使用基于块的动画方法来指定您的动画。
https://developer.apple.com/Library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html
希望对你有帮助!
【讨论】:
更改为动画块。 UIView 正在更新。但这并没有反映在 UI 中。添加了 [查看 layoutIfNeeded]。还是不行。【参考方案3】:我使用了这个代码。它没有在滚动视图中向上移动。但改变了他们的XY位置。 但这在我的 iPhone 6 中有效。我没有用其他 iPhone 检查它们。
func textViewDidBeginEditing(textView: UITextView)
textView.frame = CGRectMake(textView.frame.origin.x, textView.frame.origin.y - 216 , textView.frame.size.width, textView.frame.size.height)
buttonProp.frame = CGRectMake(buttonProp.frame.origin.x, buttonProp.frame.origin.y - 216, buttonProp.frame.size.width, buttonProp.frame.size.height)
MessageView.frame = CGRectMake(MessageView.frame.origin.x, MessageView.frame.origin.y - 216, MessageView.frame.size.width, MessageView.frame.size.height)
datePicked.frame = CGRectMake(datePicked.frame.origin.x, datePicked.frame.origin.y - 216, datePicked.frame.size.width, datePicked.frame.size.height)
func textViewDidEndEditing(textView: UITextView)
textView.frame = CGRectMake(textView.frame.origin.x, textView.frame.origin.y + 216, textView.frame.size.width, textView.frame.size.height)
buttonProp.frame = CGRectMake(buttonProp.frame.origin.x, buttonProp.frame.origin.y + 216, buttonProp.frame.size.width, buttonProp.frame.size.height)
MessageView.frame = CGRectMake(MessageView.frame.origin.x, MessageView.frame.origin.y + 216, MessageView.frame.size.width, MessageView.frame.size.height)
datePicked.frame = CGRectMake(datePicked.frame.origin.x, datePicked.frame.origin.y + 216, datePicked.frame.size.width, datePicked.frame.size.height)
我的所有组件都被编程为在编辑开始时移动。并在编辑后移回。手动编辑。是的。
【讨论】:
以上是关于iOS 8 出现键盘时 UIView 上移 |问题的主要内容,如果未能解决你的问题,请参考以下文章