Расширение iMessage: UITextView в дочернем контроллере представления, поведение прокрутки имеет несколько проблем
У меня есть очень простой контроллер представления в расширении iMessage. (Расширенный вид конечно). Я знаю, что вы не можете иметь клавиатурный ввод в компактном представлении...
UITextView ограничен элементом над ним и под ним. Он имеет заданную высоту и ширину. Ограничения все в порядке и не нарушены.
Все параметры в textview в конструкторе интерфейсов были оставлены как DEFAULTS.
Следующие проблемы возникают с UITextView:
Когда я начинаю редактировать, курсор едва виден. (в нижней части поля половина отрезана вертикально).
Ввод первой буквы переводит курсор в вертикальный центр текстового представления.
Вставка новой строки, а затем символа, снова возвращает курсор вниз.
Затем, набрав последующие символы, вы снова вернете курсор в вертикальный центр. И каждый второй персонаж снова прокручивает весь текстовый вид вниз. Таким образом, вы получаете этот странный отскок вверх и вниз при каждом нажатии клавиши.
Визуальная подсказка полосы прокрутки на правой стороне не отражает правильную высоту текстового представления при прокрутке. (Полоса прокрутки опускается только на половину высоты текста.)
Я ожидаю, что UITextView будет работать так по умолчанию:
Курсор должен перейти в верхнюю часть текстового представления при активации и редактировании.
Вид текста не должен прыгать при наборе клавиш после новой строки.
Индикатор вертикальной полосы прокрутки должен отображать весь диапазон текстового поля, а не его половину.
Таким образом, очевидно, что внутреннее представление прокрутки внутри текстового представления имеет проблему с определением размеров вещей.
Кто-нибудь знает, если это специфическая проблема iMessage, или была ли у кого-то эта проблема также вне iMessage, и как ее исправить?
Мои ограничения IB (второй вид вниз - текстовый вид):
Видео Демонстрация проблемы: https://youtu.be/1bkvHnkXLWM
ОБНОВЛЕНИЕ: я использую дочерние контроллеры представления для встраивания моего контроллера представления в корневой контроллер. Я пробовал пустое приложение Hello World, и UITextView работает нормально по умолчанию. Поэтому проблема связана с тем, как я встраиваю дочерний контроллер вида.
Вот код, который я использую для встраивания моего Child View Controller:
- (void)showViewController:(UIViewController*)vcToShow isPop:(BOOL)isPop
{
NSLog(@"Presenting Controller: %@", vcToShow);
[self.activeVC willMoveToParentViewController:nil];
[self addChildViewController:vcToShow];
vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO;
vcToShow.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.rootView addControls:@[vcToShow.view]
align:VerticalAlignStretchToFullHeight];
UIViewController* currentVC = self.activeVC;
self.activeVC = vcToShow;
vcToShow.view.alpha = 0.0f;
[self transitionFromViewController:currentVC
toViewController:vcToShow
duration:0.3
options:UIViewAnimationOptionTransitionNone
animations:^{
vcToShow.view.alpha = 1.0f;
}
completion:^(BOOL finished) {
[currentVC removeFromParentViewController];
[vcToShow didMoveToParentViewController:self];
[self updateScreenState];
if (isPop) {
[self removeReferenceToController:currentVC];
}
}];
}
1 ответ
У меня есть решение.
Вместо того чтобы использовать Interface Builder для размещения моего UITextView, я использовал свой собственный метод генерации программных ограничений для создания и размещения UITextView, только после ViewDidAppear.
Я подозреваю, что в то время, когда Интерфейсный конструктор отображал представление дочернего ВК, в нем не было всего заполненного, необходимого для внутреннего просмотра прокрутки UITextView. Таким образом, представление прокрутки было инициализировано с неправильными значениями измерения, и, следовательно, было бы сбой на все, что связано с прокруткой. После того, как все программно выполнено в viewDidAppear (в дочернем VC), текстовое представление теперь прокручивается правильно, и курсор всегда в начале, работает как положено.
Код обновления:
Полностью убрал UITextView из конструктора интерфейса.
Добавил это программно (вызывается из viewDidAppear):
self.textView = [[UITextView alloc] init]; self.textView.translatesAutoresizingMaskIntoConstraints = NO; CGFloat topPadding = self.instructionLabel.frame.origin.y + self.instructionLabel.frame.size.height + TEXT_VIEW_TOP_PADDING; // This custom method generates Visual Constraint format for me // so i don't have to write manual individual constraint syntax. [self.rootView addControls:@[self.textView] align:VerticalAlignTop withHeight:TEXT_VIEW_HEIGHT verticalPadding: 0 horizontalPadding: 20 topPadding: topPadding];