2013-07-09 1 views
0

У меня есть приложение 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]; 

Это, кажется, работает хорошо, за исключением, когда приложение открывает пользователю больше не сосредоточены в этой области. Я бы предпочел, если бы приложение просто открылось, как было. Мне также очень любопытно, почему система ведет себя так, и, возможно, есть более элегантный способ справиться с этим.

ответ

0

Мой подход должен был бы закрыть клавиатуру, как приложение переходит в фоновый режим и установить фокус на текстовом поле в viewWillAppear:

+0

viewWillAppear не вызывается, когда приложение переходит обратно на передний план .. Система IOS сбрасывает просматривать самостоятельно. Я думаю, что лучшим решением будет обнаружение, если клавиатура показывается, и если это снова открывается вверх (когда приложение становится активным после короткого таймаута, так как в противном случае система еще не изменила мое окно). –

Смежные вопросы