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

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

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

Все параметры текстового представления в построителе интерфейса оставлены как ПО УМОЛЧАНИЮ.

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

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

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

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

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

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

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

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

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

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

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

Кто-нибудь знает, является ли это конкретной проблемой iMessage или была ли у кого-нибудь эта проблема за пределами iMessage и как ее исправить?

Мои ограничения IB (второй вид внизу - текстовый):  введите описание изображения здесь

Видео-демонстрация проблемы: https://youtu.be/1bkvHnkXLWM

ОБНОВЛЕНИЕ: я использую дочерние контроллеры представления, чтобы встроить свой контроллер представления в корневой контроллер. Я пробовал пустое приложение Hello World, и UITextView по умолчанию работает нормально. Таким образом, проблема связана с тем, как я встраиваю дочерний контроллер представления.

Это код, который я использую для встраивания своего дочернего контроллера представления:

- (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];
            }
        }];
}

person FranticRock    schedule 14.09.2017    source источник
comment
просто дикая догадка, но может быть это строка: `vcToShow.view.translatesAutoresizingMaskIntoConstraints = NO; ? you are using autoresizing mask later, is that not supposed to be set to YES`?   -  person Milan Nosáľ    schedule 14.09.2017
comment
Привет. Изменение translatesAutoresizingMaskIntoConstraints на YES не повлияло на UITextView. Спасибо.   -  person FranticRock    schedule 14.09.2017


Ответы (1)


У меня есть решение.

Вместо использования Interface Builder для размещения моего UITextView я использовал свой собственный метод генерации программных ограничений для создания и размещения UITextView только после ViewDidAppear.

Я подозреваю, что в то время, когда построитель интерфейса отображал представление дочернего VC, в нем не было заполнено все, что требовалось для внутреннего представления прокрутки 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];
    
person FranticRock    schedule 14.09.2017