我有一个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];
}
这很好用,满足了我们的需要。一个问题是,当用户编辑文本字段并按下主页按钮,然后再次打开应用程序时,当应用程序重新打开时(如果它只是进入后台并没有被杀死),它的位置将与以前完全一样(大约十分之一秒),然后它将在键盘仍然存在的情况下重置回中心,从而使它在屏幕上的位置低于应有的位置,并隐藏了一些字段。问题是,当视图位置重置时,我的代码都不会运行。当应用程序进入后台或返回活动状态时,根本不会调用slideFrame。我的任何与视图相关的方法(viewDidLoad/viewDidAppear/viewWillAppear/viewWilDisappear等)在进入后台或活动时都不会被调用。我想知道为什么ios会在返回活动状态时重新定位我的视图,以及如何防止它?
我想出了一个我并不喜欢的解决方案。我所做的是观察UIApplicationDidEnterBackgroundNotification,然后使用代码关闭键盘
[self.view endEditing: YES];
这似乎很好,除非当应用程序打开时,用户不再专注于该领域。不过,我更希望这个应用程序能恢复原状。我也有点好奇为什么系统会这样运行,以及是否有更优雅的方法来处理这个问题。
我的方法是在应用程序进入后台时关闭键盘,并将焦点设置在viewWillAppear: