iOS8:在键盘转换期间移动视图会发生什么?

时间:2014-09-30 03:28:39

标签: animation ios8 uikeyboard

切换到iOS8后,当我在键盘转换期间移动视图时,我会遇到奇怪的行为。谁能解释一下发生了什么?

这是演示问题的最小示例。我有一个UITextFieldUIButton的简单视图。函数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

3 个答案:

答案 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为您提供键盘框架。然后根据它移动屏幕上的元素。