0

我有一个简单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];
}
4

2 回答 2

1

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

viewDidLayoutSubviews代替它。

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

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

于 2013-02-22T21:33:46.397 回答
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];
}
于 2013-02-22T23:23:11.163 回答