2017-02-20 5 views
1

Мой следующий код:клавиатура не показывать в первый раз (IOS)

- (void)setupSubViews { 
    [self addSubview:self.textView]; 
    [self addSubview:self.sendButton]; 

    [self.textView mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.top.equalTo(5); 
     make.bottom.equalTo(-5); 
     make.leading.equalTo(9); 
    }]; 
    [self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.centerY.equalTo(self); 
     make.trailing.equalTo(-9); 
     make.leading.equalTo(self.textView.mas_trailing).offset(7); 
     make.width.equalTo(60); 
     make.height.equalTo(40); 
    }]; 
} 

Шоу функцию, чтобы сделать TextView becomeFirstResponder

- (void)show { 
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
    [keyWindow addSubview:self]; 
    [self mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.leading.trailing.equalTo(0); 
     make.bottom.equalTo(InputHeight); 
    }]; 
    [self.textView becomeFirstResponder]; 
} 

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

- (void)keyboardWillChangeFrame:(NSNotification *)noti { 
    if (!self.textView.isFirstResponder) { 
     return; 
    } 
    NSValue *endFrame = noti.userInfo[@"UIKeyboardFrameEndUserInfoKey"]; 
    CGFloat endY = [endFrame CGRectValue].origin.y; 
    BOOL isBackToBottom = endY == UI_SCREEN_HEIGHT; 
    CGFloat needOffset = endY - (UI_SCREEN_HEIGHT + InputHeight); 

    if (isBackToBottom) { 
     [UIView animateWithDuration:0.25 animations:^{ 
      self.transform = CGAffineTransformIdentity; 
     } completion:^(BOOL finished) { 
      [self removeFromSuperview]; 
     }]; 
    } else { 
     [UIView animateWithDuration:0.25 animations:^{ 
      self.transform = CGAffineTransformMakeTranslation(0, needOffset); 
     }]; 
    } 
} 

Use Case: ViewController имеет кнопку, кнопка щелчка действия так:

- (void)beginChat { 
    [self.inputView show]; 
} 

self.inputView является выше customView,

- (LiveChatInputView *)inputView { 
    if (!_inputView) { 
     _inputView = [LiveChatInputView new]; 
     _inputView.sendBlock = ^(NSString *string) { 
      .... 
     }; 
    } 
    return _inputView; 
} 

Теперь мой вопрос заключается в том, что, когда мы вызываем функцию show в первый раз после запуска приложения, клавиатура не будет отображаться, но вызов show функция во втором ти меня, все хорошо.

Как справиться с этим вопросом, THX.

+0

в первый раз, когда функция show называется check, что self.textView равен нулю или нет. –

+0

Вы тестируете устройство или симулятор? на sim это обычная проблема, что клавиатура иногда работает неправильно. – zero3nna

+0

@Fahad Jamal Я уверен, что self.textView не ноль – Archerlly

ответ

0

Я сделал ошибку, вызовите [self removeFromSuperview] в функции keyboardWillChangeFrame:.

Я думал UIKeyboardWillChangeFrameNotification мог отправить его только один раз на клавиатуре показать или скрыть, поэтому я положил осуществление обратного действия в keyboardWillChangeFrame: и контролируется endFrame.origin.y == UI_SCREEN_HEIGHT

На практике, дело в том, что: когда клавиатура показать, NSNotificationCenter разместит UIKeyboardWillChangeFrameNotification три раза:

первого enter image description here второго enter image description here третий enter image description here

Советы: только первый раз показывают клавиатуры после нанесения запуска первого UIKeyboardWillChangeFrameNotification из выше трех, endFrame.origin.y равно UI_SCREEN_HEIGHT

Мое решение: Наблюдайте за UIKeyboardWillHideNotification и выполняйте действия в этом обратном вызове.

Спасибо за все ответы на этот вопрос.

0

Вызов этого метода не является гарантией того, что объект станет первым ответчиком.

Согласно компании Apple,

Объект Ответчик только становится первым ответчиком, если текущий ответчик может подать в отставку статус первого-ответчика (canResignFirstResponder) и новый ответчик может стать первым ответчиком.

Try вызова becomeFirstResponder, как показано ниже,

[self.textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; 
+0

THX, но это не работает для меня. перед '[self.textView статьFirstrespond]', self.textView.canBecomeFirstResponder возвращает да – Archerlly