UIKit: UIScrollView автоматически прокручивается, когда подпредставление увеличивается за пределы края экрана

В контексте iPhone:

У меня есть UIScrollView , содержащий UIImage . Когда пользователь касается экрана внутри UIImage , UITextField добавляется там, где коснулся пользователь. Пользователь может редактировать это UITextField , и размер текстового поля будет автоматически изменяться в зависимости от того, был ли текст добавлен или удален.

Когда редактируемое UITextField увеличивается, ширина scrollview автоматически прокручивается, чтобы показать увеличенную ширину.

Проблема возникает из-за того, что автоматическая прокрутка текстового поля не учитывает y-значение экрана

Например, скажем, пользователь добавил текстовое поле внизу изображения. Когда они перейдут к редактированию этого текстового поля, появится клавиатура, скрывающая текстовое поле. У меня есть код для прокрутки экрана и отображения текстового поля. Проблема возникает, когда пользователь вводит столько текста, что это текстовое поле выходит за край экрана. Когда это происходит, экран прокручивается по горизонтали, чтобы вместить более широкий текст, но также и по вертикали - вертикальная прокрутка заканчивается тем, что текстовое поле скрывается, по сути сводя на нет все, что я делал для отображения текстового поля.

Код для отображения текстового поля, если оно скрыто с клавиатуры:

- (void)keyboardWasShown:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    self.offset = self.contentOffset;

    CGRect frame = self.frame;
    // self.activeField is the name of the field that is the current first responder - this just adds a little bit of padding
    frame.size.height -= keyboardSize.height + (self.activeField.frame.size.height * 2);

    if (!CGRectContainsPoint(frame, self.activeField.frame.origin)) {
        CGPoint scrollPoint = CGPointMake(self.offset.x, self.activeField.frame.origin.y - keyboardSize.height + (activeField.frame.size.height * 2));
    [self setContentOffset:scrollPoint animated:YES];
    }
}

Вот код для увеличения размера текстового поля:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    CGSize stringSize = [string sizeWithFont:textField.font];
    CGSize newSize = [newString sizeWithFont:textField.font];

    // Make textField wider if we're close to running up against it
    if (newSize.width > (textField.frame.size.width - self.widthOffset)) {
        CGRect textFieldFrame = textField.frame;
        if (stringSize.width > self.widthOffset) {
            textFieldFrame.size.width += stringSize.width;
        }
        textFieldFrame.size.width += self.widthOffset;
        textField.frame = textFieldFrame;
    }

    // Shrink the textField if there is too much wasted space
    if ((textField.frame.size.width - newSize.width) > self.widthOffset) {
        CGRect textFieldFrame = textField.frame;
        textFieldFrame.size.width = newSize.width + self.widthOffset;
        textField.frame = textFieldFrame;
    }
    return YES;
}

Вопрос: как заставить UIScrollView учитывать само значение y при автоматической прокрутке ?

13
задан Rishil Patel 26 January 2019 в 05:43
поделиться