2015-06-05 5 views
0

У меня есть представление коллекции, в котором отображаются горизонтальные ячейки, которые заполняют экран (это приложение iOS). В некоторых ячейках есть текстовые поля. Если пользователь нажимает кнопку «Далее», просмотр коллекции переходит к следующему экрану. Клавиатура изменяет размер представления, содержащего представление коллекции. Все это в навигационном контроллере. Проблема в том, что когда клавиатура находится на экране, а пользователь нажимает следующую анимацию с контроллера навигации (push), а клавиатура отклоняется от перекрытия. Это отображает следующий вид в верхней части экрана (например, клавиатура все еще там).Неверная высота представления после ввода контроллера контроллера

Это код, который изменяет вид:

-(void)keyboardWillShow:(NSNotification*)notification { 

    NSDictionary *info = [notification userInfo]; 

    NSValue *keyboardFrameValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; 
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    UIViewAnimationCurve animationCurve = [info[UIKeyboardAnimationCurveUserInfoKey] integerValue]; 

    CGRect keyboardFrame = [keyboardFrameValue CGRectValue]; 
    BOOL isPortrait = UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation); 
    CGFloat keyboardHeight = isPortrait ? keyboardFrame.size.height : keyboardFrame.size.width; 

    self.bottomConstraint.constant = -keyboardHeight; 
    [self setNeedsUpdateConstraints]; 



    [UIView animateWithDuration:animationDuration delay:0.0 options:(animationCurve << 16) animations:^{ 
     NSLog(@"keyboard will show"); 
     [self layoutIfNeeded]; 
    } completion:NULL]; 

} 



-(void)keyboardWillHide:(NSNotification*)notification { 

    NSDictionary *info = [notification userInfo]; 

    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    UIViewAnimationCurve animationCurve = [info[UIKeyboardAnimationCurveUserInfoKey] integerValue]; 

    self.bottomConstraint.constant = 0; 
    [self setNeedsUpdateConstraints]; 

    [UIView animateWithDuration:animationDuration delay:0.0 options:(animationCurve << 16) animations:^{ 
     NSLog(@"keyb will hide"); 


     [self layoutIfNeeded]; 
    } completion:^(BOOL finished) { 
     if (finished) { 
      [self layoutIfNeeded]; 
     } 
    }]; 

} 

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

+0

Это более обходной путь, чем решение, но может отключить «следующий» ключ, когда отображается клавиатура? –

ответ

0

Попробуйте прослушать UIKeyboardWillChangeFrameNotification вместо UIKeyboardWillShowNotification и UIKeyboardWillHideNotification. Вы можете обрабатывать UIKeyboardWillChangeFrameNotification следующим образом:

- (void)handleKeyboardWillChangeFrameNotification:(NSNotification *)notification { 
    CGRect keyboardEndFrame = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardEndFrame = [self.view convertRect:keyboardEndFrame fromView:nil]; 
    UIViewAnimationCurve animationCurve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; 
    NSTimeInterval animationDuration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] integerValue]; 
    CGFloat keyboardHeight = self.view.bounds.size.height - keyboardEndFrame.origin.y; 

    // Constraint animation. 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:animationDuration]; 
    [UIView setAnimationCurve:animationCurve]; 
    self.bottomConstraint.constant = keyboardHeight; 
    [self.view layoutIfNeeded]; 
    [UIView commitAnimations]; 
} 

Если это не помогает, вы можете попытаться избежать анимации перекрывающихся с помощью НОД. Вот псевдокод:

1), когда пользователь вводит следующую кнопку, заставить текущий первый ответчик подать в отставку его (вы можете использовать [self.view endEditing: ДА])

2) отправку перехода к следующий экран асинхронно в основном потоке с использованием dispatch_async

EDIT:

вы тестирование на устройстве или в симуляторе? У симулятора есть несколько ошибок, связанных с клавиатурой, показывающей/скрывающейся.

+0

Это как на устройстве, так и на симуляторе – user426132

+0

Точно так же бывает, если я использую ваш метод вместо 2 для клавиатуры, будет отображаться/скрываться. – user426132

+0

Я испытал аналогичную проблему несколько недель назад. Я сделал некоторую отладку, и я обнаружил, что иногда уведомление клавиатуры отправляется, несмотря на то, что клавиатура не меняла свой фрейм. Странно, но код выше сделал трюк для меня. Если вы считаете, что основная причина - перекрывающиеся анимации, попробуйте отложить анимацию push UINavigationController на следующий цикл цикла с использованием GCD. Это может быть очень сложная проблема, хотя я не могу помочь вам больше, не зная больше от вашего кода и пользовательского интерфейса. – Merlin

2

Это может быть возможным решением вашей проблемы:

на нажатие следующей кнопки:

 [collectionviewCell.textField resignFirstResponder]; 
+0

Я использую [self.collectionView endEditing: YES]; – user426132

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

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