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



我有一个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:

中的文本字段上

最新更新