0

我有一个 iOS 应用程序,其中启动的主屏幕(登录屏幕)有 3 个文本字段和字段下方的“登录”按钮。主视图中有一个内容视图,其中包含字段和按钮,并且垂直居中。当 3 个字段中的任何一个开始编辑时,视图会向上移动以使它们可见,按钮也是如此。相关的代码是:

(void)viewDidLoad {
    [super viewDidLoad];
    [userName addTarget: self action: @selector(slideFrameUp:) forControlEvents: UIControlEventEditingDidBegin];
    [userName addTarget: self action: @selector(slideFrameDown:) forControlEvents: UIControlEventEditingDidEnd];

     //.... same thing for 2 other fields

}
-(void) slideFrameUp: (id)sender {
    CGFloat slidePoints = 116.0;
    [self slideFrame: YES distance: slidePoints];
}


-(void) slideFrameDown: (id)sender {
    CGFloat slidePoints = 116.0;
    [self slideFrame: NO distance: slidePoints];
}


-(void) slideFrame:(BOOL) up distance: (NSInteger)amount {
    const float movementDuration = 0.3f; // tweak as needed
    int movement = (up ? -amount : amount);
    [UIView beginAnimations: nil context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

这很好用,可以满足我们的需要。一个小问题是,当用户正在编辑文本字段并按下主页按钮然后再次打开应用程序时,当应用程序重新打开时(如果它只是进入后台并且没有被杀死),它将准确定位如何它以前是最初的(大约 1/10 秒),然后它将在键盘仍然存在的情况下重置回中心,从而使其在屏幕上的位置低于应有的位置并隐藏一些字段。问题是当视图位置重置时,我的代码都没有运行。当应用程序进入后台或返回活动状态时,根本不会调用 slideFrame。我的视图相关方法(viewDidLoad/viewDidAppear/viewWillAppear/viewWillDisappear 等)都不会在进入后台或处于活动状态时被调用。我'

我想出了一个我不太喜欢的解决方案。我所做的是观察 UIApplicationDidEnterBackgroundNotification 然后使用代码关闭键盘:

[self.view endEditing: YES];

这似乎工作正常,除非当应用程序打开时用户不再专注于该领域。不过,如果应用程序按原样打开,我更愿意。我也只是有点好奇为什么系统会以这种方式运行,以及是否有更优雅的方式来处理这个问题。

4

1 回答 1

0

我的方法是在应用程序进入后台时关闭键盘,并将焦点放在 viewWillAppear 中的文本字段上:

于 2013-07-09T19:44:58.503 回答