Расширение iMessage: UITextView в дочернем контроллере представления, поведение прокрутки имеет несколько проблем

У меня есть очень простой контроллер представления в расширении iMessage. (Расширенный вид конечно). Я знаю, что вы не можете иметь клавиатурный ввод в компактном представлении...

UITextView ограничен элементом над ним и под ним. Он имеет заданную высоту и ширину. Ограничения все в порядке и не нарушены.

Все параметры в textview в конструкторе интерфейсов были оставлены как DEFAULTS.

Следующие проблемы возникают с UITextView:

  1. Когда я начинаю редактировать, курсор едва виден. (в нижней части поля половина отрезана вертикально).

  2. Ввод первой буквы переводит курсор в вертикальный центр текстового представления.

  3. Вставка новой строки, а затем символа, снова возвращает курсор вниз.

  4. Затем, набрав последующие символы, вы снова вернете курсор в вертикальный центр. И каждый второй персонаж снова прокручивает весь текстовый вид вниз. Таким образом, вы получаете этот странный отскок вверх и вниз при каждом нажатии клавиши.

  5. Визуальная подсказка полосы прокрутки на правой стороне не отражает правильную высоту текстового представления при прокрутке. (Полоса прокрутки опускается только на половину высоты текста.)

Я ожидаю, что UITextView будет работать так по умолчанию:

  1. Курсор должен перейти в верхнюю часть текстового представления при активации и редактировании.

  2. Вид текста не должен прыгать при наборе клавиш после новой строки.

  3. Индикатор вертикальной полосы прокрутки должен отображать весь диапазон текстового поля, а не его половину.

Таким образом, очевидно, что внутреннее представление прокрутки внутри текстового представления имеет проблему с определением размеров вещей.

Кто-нибудь знает, если это специфическая проблема 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), текстовое представление теперь прокручивается правильно, и курсор всегда в начале, работает как положено.

Код обновления:

  1. Полностью убрал UITextView из конструктора интерфейса.

  2. Добавил это программно (вызывается из 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];
    
Другие вопросы по тегам