Ios 应用程序重新进入活动状态时,为什么要重新定位uiview
我有一个iOS应用程序,其中启动的主屏幕(登录屏幕)有3个文本字段和字段下方的“登录”按钮。主视图中有一个内容视图,其中包含字段和按钮,并且垂直居中。当三个字段中的任何一个开始编辑时,视图会向上移动,使它们可见,按钮也可见。这方面的相关代码是:Ios 应用程序重新进入活动状态时,为什么要重新定位uiview,ios,cocoa-touch,ios6,Ios,Cocoa Touch,Ios6,我有一个iOS应用程序,其中启动的主屏幕(登录屏幕)有3个文本字段和字段下方的“登录”按钮。主视图中有一个内容视图,其中包含字段和按钮,并且垂直居中。当三个字段中的任何一个开始编辑时,视图会向上移动,使它们可见,按钮也可见。这方面的相关代码是: (void)viewDidLoad { [super viewDidLoad]; [userName addTarget: self action: @selector(slideFrameUp:) forControlEvents: U
(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];
}
这很好,符合我们的需要。一个问题是,当用户编辑一个文本字段并按下home(主页)按钮,然后再次打开应用程序时,当应用程序重新打开时(如果它只进入后台并且没有被杀死),它将精确地定位到之前的位置(大约1/10秒)然后,它将在键盘仍然存在的情况下重置回中心,从而使其在屏幕上的位置低于应有的位置,并隐藏一些字段。问题是,当视图位置重置时,我的代码都不会运行。当应用程序进入后台或返回活动状态时,根本不会调用SlideName。我的视图相关方法(viewDidLoad/ViewDidDisplay/ViewWillDisplay/ViewWillEnglish等)在进入后台或活动状态时均未被调用。我想知道为什么ios在返回活动状态时会重新定位我的视图,以及如何防止它
我想出了一个我并不喜欢的解决办法。我所做的是观察UIApplicationIdentinterBackgroundNotification,然后使用以下代码关闭键盘:
[self.view endEditing: YES];
这似乎很好,除非当应用程序打开时,用户不再专注于现场。不过,我更希望应用程序能恢复原样。我也有点好奇为什么系统会这样运行,是否有更优雅的方法来处理这个问题。我的方法是在应用程序进入后台时关闭键盘,并在ViewWillDisplay中设置文本字段的焦点:当应用程序返回前台时,不会调用ViewWillDisplay。。iOS系统自行重置视图。我认为最好的解决方案是检测键盘是否显示,如果显示,则再次向上滑动屏幕(当应用程序激活时,在短时间超时后,否则系统尚未重新定位我的窗口)。