Ios 应用程序重新进入活动状态时,为什么要重新定位uiview

Ios 应用程序重新进入活动状态时,为什么要重新定位uiview,ios,cocoa-touch,ios6,Ios,Cocoa Touch,Ios6,我有一个iOS应用程序,其中启动的主屏幕(登录屏幕)有3个文本字段和字段下方的“登录”按钮。主视图中有一个内容视图,其中包含字段和按钮,并且垂直居中。当三个字段中的任何一个开始编辑时,视图会向上移动,使它们可见,按钮也可见。这方面的相关代码是: (void)viewDidLoad { [super viewDidLoad]; [userName addTarget: self action: @selector(slideFrameUp:) forControlEvents: U

我有一个iOS应用程序,其中启动的主屏幕(登录屏幕)有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];
}
这很好,符合我们的需要。一个问题是,当用户编辑一个文本字段并按下home(主页)按钮,然后再次打开应用程序时,当应用程序重新打开时(如果它只进入后台并且没有被杀死),它将精确地定位到之前的位置(大约1/10秒)然后,它将在键盘仍然存在的情况下重置回中心,从而使其在屏幕上的位置低于应有的位置,并隐藏一些字段。问题是,当视图位置重置时,我的代码都不会运行。当应用程序进入后台或返回活动状态时,根本不会调用SlideName。我的视图相关方法(viewDidLoad/ViewDidDisplay/ViewWillDisplay/ViewWillEnglish等)在进入后台或活动状态时均未被调用。我想知道为什么ios在返回活动状态时会重新定位我的视图,以及如何防止它

我想出了一个我并不喜欢的解决办法。我所做的是观察UIApplicationIdentinterBackgroundNotification,然后使用以下代码关闭键盘:

[self.view endEditing: YES];

这似乎很好,除非当应用程序打开时,用户不再专注于现场。不过,我更希望应用程序能恢复原样。我也有点好奇为什么系统会这样运行,是否有更优雅的方法来处理这个问题。

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

当应用程序返回前台时,不会调用ViewWillDisplay。。iOS系统自行重置视图。我认为最好的解决方案是检测键盘是否显示,如果显示,则再次向上滑动屏幕(当应用程序激活时,在短时间超时后,否则系统尚未重新定位我的窗口)。