it-swarm.com.ru

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

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

У меня есть UIViewController, который имеет UIScrollView и внутри UIScrollView есть несколько текстовых полей. 

Я знаю, как сделать это вручную, если это необходимо; однако, из того, что я читал, кажется возможным иметь автопрокрутку. Помогите, пожалуйста.

25
Nosrettap

Я надеюсь, что этот пример поможет вам Вы можете перейти к любой точке с помощью этого кода.

scrollView.contentOffset = CGPointMake(0,0);

Так что, если у вас есть текстовое поле, оно должно иметь некоторую позицию х, у, чтобы вы могли использовать 

CGPoint point = textfield.frame.Origin ;
scrollView.contentOffset = point 

Это должно сработать,

Но если вы не знаете, когда вызывать этот код, вам следует изучить UITextFieldDelegate method 

Реализуйте этот метод в своем коде

- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}

Я надеюсь, что вы знаете, как использовать методы делегата.

30
Adeel Pervaiz

Я знаю, что на этот вопрос уже был дан ответ, но я решил поделиться кодовой комбинацией, которую я использовал в ответах @Adeel и @Basil, так как мне кажется, что она отлично работает на iOS 9.

-(void)textFieldDidBeginEditing:(UITextField *)textField {

    // Scroll to the text field so that it is
    // not hidden by the keyboard during editing.
    [scroll setContentOffset:CGPointMake(0, (textField.superview.frame.Origin.y + (textField.frame.Origin.y))) animated:YES];
}

-(void)textFieldDidEndEditing:(UITextField *)textField {

    // Remove any content offset from the scroll
    // view otherwise the scroll view will look odd.
    [scroll setContentOffset:CGPointMake(0, 0) animated:YES];
}

Я также использовал анимированный метод, он обеспечивает более плавный переход.

10
Supertecnoboff

Вы ничего не должны делать вручную. Это поведение по умолчанию. Есть две возможности, почему вы не видите поведение

  1. Наиболее вероятная причина в том, что клавиатура закрывает ваш UITextField. Смотрите решение ниже
  2. Другая возможность состоит в том, что у вас есть другая UIScrollView где-то в иерархии представления между UITextField и UIScrollView, которую вы хотите автоматически прокручивать. Это менее вероятно, но все еще может вызвать проблемы.

Для # 1 вы хотите реализовать что-то похожее на рекомендации Apple для Перемещение контента, расположенного под клавиатурой . Обратите внимание, что код, предоставленный Apple, не учитывает ротацию. Для улучшения их кода, проверьте в этой записи блога реализацию метода keyboardDidShow, который правильно переводит кадр клавиатуры с помощью окна.

6
Michael McGuire
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGRect rect = [textField bounds];
    rect = [textField convertRect:rect toView:self.scrollView];
    rect.Origin.x = 0 ;
    rect.Origin.y -= 60 ;
    rect.size.height = 400;

    [self.scrollView scrollRectToVisible:rect animated:YES];
}
4
George

Вы можете использовать эту функцию для автоматической прокрутки UITextField

на UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {

[self autoScrolTextField:textField onScrollView:self.scrollView];
}




- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView { 
 float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.Origin.y + (textField.frame.Origin.y + textField.frame.size.height);

if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
    slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
    CGPoint point = CGPointMake(0.0f, slidePoint);
    scrollView.contentOffset = point;
}

Правка:

Я сейчас использую IQKeyboardManager Слава разработчику этого, вам нужно попробовать это.

3
Basil Mariano

Вот обновление Swift 4 для ответа @ Supertecnoboff. Это отлично сработало для меня.

func textFieldDidBeginEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.Origin.y)!), animated: true)
}

func textFieldDidEndEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}

Удостоверьтесь, чтобы расширить UITextFieldDelegate и установить делегата текстовых полей на себя.

2
donmiller

Если у вас есть несколько текстовых полей, скажем Textfield1, Textfield2, Textfield3 и вы хотите прокрутить представление прокрутки вдоль оси y, когда textfield2 станет первым респондентом:

if([Textfield2 isFirstResponder])
{
    scrollView.contentOffset = CGPointMake(0,yourY);
} 
1
Deep Batra

Как упоминал Майкл Макгуайр в своем пункте № 2 выше, поведение системы по умолчанию ведет себя неправильно, когда представление прокрутки содержит другое представление прокрутки между текстовым полем и представлением прокрутки. Я обнаружил, что неправильное поведение также происходит, когда есть представление прокрутки просто следующее к текстовому полю (оба встроены в представление прокрутки, которое необходимо настроить, чтобы отобразить текстовое поле, когда текстовое поле хочет начать редактирование. Это на iOS 12.1.

Но мое решение отличается от вышеуказанного. В моем виде прокрутки верхнего уровня, который подклассифицирован, так что я могу добавлять свойства и переопределять методы, я переопределяю scrollRectToVisible:animated:. Он просто вызывает свой [super scrollRectToVisible:animated:], если только не существует набора свойств, который указывает ему корректировать переданную rect, которая является рамкой текстового поля. Когда свойство не ноль, это ссылка на рассматриваемый UITextField, и rect настраивается так, что представление прокрутки идет дальше, чем думала система. Поэтому я поместил это в файл подкласса заголовка UIScrollView:

@property (nullable) UITextField *textFieldToBringIntoView;

(с соответствующим @synthesize textFieldToBringIntoView; в реализации. Затем я добавил этот метод переопределения к реализации:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)how
{
    if (textFieldToBringIntoView) {
       // Do whatever mucking with `rect`'s Origin needed to make it visible
       // based on context or its spatial relationship with the other
       // view that the system is getting confused by.

       textFieldToBringIntoView = nil;        // Go back to normal
       }
    [super scrollRectToVisible:rect animated:how];
}

В методе делегата для UITextField, когда он собирается начать редактирование, просто установите для textFieldToBringIntoView значение textField:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Ensure it scrolls into view so that keyboard doesn't obscure it
    // The system is about to call |scrollRectIntoView:| for the scrolling
    // superview, but the system doesn't get things right in certain cases.

    UIScrollView *parent = (UIScrollView *)textField.superview;
    // (or figure out the parent UIScrollView some other way)

    // Tell the override to do something special just once
    // based on this text field's position in its parent's scroll view.
    parent.textFieldToBringIntoView = textField;
    // The override function will set this back to nil

    return(YES);
}

Вроде работает. И если Apple исправит их ошибку, похоже, что она все еще может работать (скрестив пальцы).

0
jsbox