UIView在动画后没有回到正确的位置

时间:2013-02-22 21:26:55

标签: ios animation uiview nsnotificationcenter uikeyboard

我有一个简单的UITextField,当有人去编辑它,键盘弹出时,视图会向上移动,以便用户可以看到他们输入的内容。但是,当我关闭键盘时,视图没有返回到原始位置!我使用CGPoint属性捕获viewDidLoad上的原始位置,然后在键盘关闭时尝试将其设置回原来的位置。

代码:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Set the original center point for shifting the view
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    self.originalCenter = self.view.center;
}

- (void)doneWithNumberPad {

    [locationRadius resignFirstResponder];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.center = self.originalCenter;
    [UIView commitAnimations];
}

- (void)keyboardDidShow:(NSNotification *)note
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.center = CGPointMake(self.originalCenter.x, 150);
    [UIView commitAnimations];
}

2 个答案:

答案 0 :(得分:1)

调用viewDidLoad时,尚未针对当前设备的屏幕大小或方向布置视图层次结构。现在看self.view.center还为时过早。

请改为viewDidLayoutSubviews

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.originalCenter = self.view.center;
}

请注意,如果您支持自动旋转,如果在自动旋转发生时键盘可见,即使这样也无法正常工作。

答案 1 :(得分:0)

如果你不需要一个绝对的最终中心位置,一个可靠的方法来实现这个功能就是将视图向上移动一个由键盘显示时定义的固定值,并将其向下移动固定值。键盘隐藏。

#define OFFSET 100

- (void)doneWithNumberPad {
    [locationRadius resignFirstResponder];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.center = CGPointMake(self.view.center.x, self.view.center.y + OFFSET);
    [UIView commitAnimations];
}

- (void)keyboardDidShow:(NSNotification *)note
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25];
    self.view.center = CGPointMake(self.view.center.x, self.view.center.y - OFFSET);
    [UIView commitAnimations];
}