UITextView исчезает за клавиатурой после набора времени - PullRequest
0 голосов
/ 29 августа 2018

Мы пока пытаемся поддерживать iOS 9 ... Это единственное место, где это происходит ...

У меня есть UITextView, который занимает весь вид, который занимает весь экран. Я зарегистрировался, чтобы получить UIKeyboardWillShowNotification и UIKeyboardWillHideNotification. Я получаю их просто отлично и настраиваю высоту моего UITextView так, чтобы он находился над клавиатурой:

- (void) keyboardWillShow:(NSNotification *)aNotification 
    {
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect bounds = self.view.bounds;
    bounds.size.height = bounds.size.height - keyboardRect.size.height;
    self.textView.frame = bounds;
    }

Опять же, это прекрасно работает. Теперь я печатаю несколько строк. Какое-то время нижняя строка текста автоматически остается над клавиатурой, когда я добавляю больше строк текста. Но в конце концов, обычно в пределах нескольких строк (возможно, 4-5), следующая строка будет проходить под клавиатурой, и я могу продолжить вводить строки под клавиатурой. В конце концов строки, которые я все еще вижу над клавиатурой, начнут прокручиваться вверх, когда я коснусь нижней части экрана линиями, которые я печатаю за клавиатурой.

Я не получаю UIKeyboardWillHideNotification во время этого процесса, но он почти ведет себя, как я, то есть размер моего UITextView, кажется, возвращается к своему первоначальному размеру до того, как была показана клавиатура.

Все это прекрасно работает в iOS 11. То есть, когда я печатаю, текст прокручивается вверх, так что нижняя строка текста никогда не идет за клавиатурой. Это просто iOS 9. Кто-нибудь помнит известную в те времена проблему и обходной путь?

1 Ответ

0 голосов
/ 30 августа 2018

Мое лучшее предположение состоит в том, что вы микшируете Autolayout с Autoresizing, и, кажется, выбираете предназначенный один в более поздних iOS, но не в iOS 9.

Быстрый пример с использованием вашего кода + ограничения автоматического макета в раскадровке привел к тому, что я считаю поведением, которое вы наблюдаете в старых iOS (iOS 9.3 Simulator, показанный ниже):

AutoResizing+AutoLayout_iOS9

Если я перевожу с чистым автоматическим подходом макета (то есть IBOutlet нижнее ограничение textView и программно настраиваю константу для этого в keyboardWillShow), то это приводит к правильному поведению на iOS 9 (без вызова setFrame):

Pure_AutoLayout_iOS9

@property (strong, nullable) IBOutlet NSLayoutConstraint *textViewBottomConstraint;

...

- (void)keyboardWillShow:(NSNotification *)aNotification {
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    self.textViewBottomConstraint.constant = -keyboardRect.size.height;
}
...