我有一个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等)。我想知道为什么ios在重新开始活动时重新定位我的视图,我该如何防止它?
我想出了一个我不喜欢的解决方案。我做的是观察UIApplicationDidEnterBackgroundNotification,然后使用代码解除键盘:
[self.view endEditing: YES];
这似乎工作正常,除非应用程序打开时用户不再关注该字段。如果应用程序刚刚打开备份,我宁愿这样做。我也有点好奇为什么系统会以这种方式运行,如果可能有一种更优雅的方式来处理它。
答案 0 :(得分:0)
我的方法是在应用程序转到后台时关闭键盘,并将焦点设置在viewWillAppear中的文本字段: