2014-02-18 2 views
0

Я хочу настроить высоту текстового поля при появлении клавиатуры. В iOS 7 это можно сделать, отредактировав NSLayoutConstraint между текстовым изображением и нижнимLayoutGuide контроллера вида.разрыв между клавиатурой и текстовым просмотром во время анимации

Это прекрасно работает с кодом ниже, за исключением одной детали. Во время анимации текст просматривается впереди клавиатуры и появляется большой зазор. Аналогично в методе keyboardWillHide.

Причина для этой «ошибки», вероятно, связана с тем, что клавиатура начинается со самой нижней части экрана, в то время как текст открывается выше из-за высоты панели инструментов.

Любые предложения о том, как исправить это?

-(void) keyboardWillShow:(NSNotification *) notification 
{ 
//update constraints 
CGRect keyboardFrame = [[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
CGRect convertedKeyboardFrame = [[self view] convertRect:keyboardFrame 
             fromView:nil]; 
CGRect toolbarFrame = [[[self navigationController] toolbar] frame]; 
CGRect convertedToolbarFrame = [[self view] convertRect:toolbarFrame 
               fromView:nil]; 
CGFloat toolbarAdjustment = (UIInterfaceOrientationIsPortrait([self interfaceOrientation])) ? CGRectGetHeight(convertedToolbarFrame) :CGRectGetWidth(convertedToolbarFrame); 

[[_textView bottomSpaceConstraint] setConstant:CGRectGetHeight(convertedKeyboardFrame) - toolbarAdjustment]; 


//animate change 
for (UIView *view in [[self view] subviews]) 
{ 
    [view setNeedsUpdateConstraints]; 
} 

[UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue] 
         delay:0 //0.2 as possible hack, otherwise a gap appears between keyboard and textview 
        options:[[[notification userInfo] valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] 
       animations:^{ 
        for (UIView *view in [[self view] subviews]) 
        { 
         [view layoutIfNeeded]; 
        } 

       } 
       completion:NULL]; 

}

+0

Быстрый чита, чтобы избежать вашей ошибки (может даже выглядеть аккуратно): Попросите нижней панели анимировать вниз от экрана перед приведением клавиатуры вверх. – ArtOfWarfare

ответ

1

Задержка, вероятно, вызвано вызовом layoutIfNeeded многократно в цикле.

В блоке анимации просто отправьте layoutIfNeeded в корневой вид, т. Е. self.view. Отправка layoutIfNeeded в корневой режим позаботится обо всей иерархии представлений. Так избавиться от цикла.

Я спрашиваю, нужен ли звонок setNeedsUpdateConstraints; если это так, его нужно только отправить в корневой вид.

Кроме того, попробуйте устранения параметра параметры анимации

options:0 
+0

Код по-прежнему работает после включения ваших замечаний. Спасибо за улучшение. Но проблема остается. Дело не в том, что есть задержка. Это то, что кривая анимации не такая же, как клавиатура. Текстовый просмотр достигнет точки назначения до клавиатуры. – user965972

+0

@ user965972 обновленный ответ с новой идеей ... исключить возможность анимации. – bilobatum

+0

Нет, это не имеет значения. – user965972

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