切换到iOS8后,当我在键盘转换期间移动视图时,我会遇到奇怪的行为。谁能解释一下发生了什么?
这是演示问题的最小示例。我有一个UITextField
和UIButton
的简单视图。函数nudgeUp
将文本字段和按钮向上移动10个点。它由buttonPressed
回调或keyboardWillShow
回调触发。
当我点按该按钮时,代码按预期工作:buttonPressed
调用nudgeUp
,按钮和文本字段跳起10点。
当我点按文字字段时,keyboardWillShow
会调用nudgeUp
,但行为却截然不同。按钮和文本字段立即向向下跳过10个点,然后在键盘显示时自动向上滑动到原始位置。
为什么会这样?如何在iOS8中键盘演示期间重新获得对动画的控制?
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification
{
// Called when the keyboard appears.
[self nudgeUp];
}
- (IBAction)buttonPressed:(id)sender {
[self nudgeUp];
}
- (void)nudgeUp
{
CGRect newTextFieldFrame = self.textField.frame;
newTextFieldFrame.origin.y -= 10;
self.textField.frame = newTextFieldFrame;
CGRect newButtonFrame = self.button.frame;
newButtonFrame.origin.y -= 10;
self.button.frame = newButtonFrame;
}
@end
答案 0 :(得分:8)
这是AutoLayout。在iOS8中有些变化,如果你启用了AutoLayout,你就不能再改变帧或中心点了。您必须创建约束的出口(垂直空间)并相应地更新它,而不是更改框架位置。约束就像任何其他ui控件一样,可以有一个插座。约束更改可以设置动画。
示例:
[UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0 options:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{
self.bottomSpaceConstraint.constant = adjustmentedValue;
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];
答案 1 :(得分:0)
您应该使用UIKeyboardDidShowNotification
(您正在使用will
版本),一切都会按预期运作:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
}
- (void)keyboardDidShow:(NSNotification *)notification
{
// Called when the keyboard finished showing up
[self nudgeUp];
}
解释是,UIKeyboardWillShowNotification
您过早地更改框架。更改后,系统将重新布置所有内容以容纳键盘,并且您的更改不会产生任何影响。
另外,我建议您切换到自动布局并忘记帧。
答案 2 :(得分:0)
尝试使用UIKeyboardWillShowNotification userInfo为您提供键盘框架。然后根据它移动屏幕上的元素。