У меня есть приложение iOS, на котором запущен главный экран (экран входа), имеет 3 текстовых поля и кнопку «Вход» под полями. В главном представлении есть представление содержимого, которое содержит поля и кнопку, и вертикально центрируется. Когда какое-либо из трех полей начинает редактирование, вид сдвигается так, чтобы они были видны, а также кнопка. Соответствующий код для этого:Почему uiview перемещается при повторном входе приложения в активное состояние
(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];
Это, кажется, работает хорошо, за исключением, когда приложение открывает пользователю больше не сосредоточены в этой области. Я бы предпочел, если бы приложение просто открылось, как было. Мне также очень любопытно, почему система ведет себя так, и, возможно, есть более элегантный способ справиться с этим.
viewWillAppear не вызывается, когда приложение переходит обратно на передний план .. Система IOS сбрасывает просматривать самостоятельно. Я думаю, что лучшим решением будет обнаружение, если клавиатура показывается, и если это снова открывается вверх (когда приложение становится активным после короткого таймаута, так как в противном случае система еще не изменила мое окно). –