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 上移 |问题的主要内容,如果未能解决你的问题,请参考以下文章

出现键盘时无法上移自定义 UIView

键盘出现时UITextField上移【Swift】

iOS开发-cell里面有textField,出现键盘自动上移

iOS-当输入框被键盘遮挡时让整个view上移

【iOS】解决键盘收起时页面上移的问题

键盘出现后 UIWebView 自动上移