Как я могу заставить UITextField двигаться вверх при наличии клавиатуры - при начале редактирования? - PullRequest
1644 голосов
/ 14 июля 2009

С iOS SDK:

У меня есть UIView с UITextField s, которые вызывают клавиатуру. Мне нужно, чтобы я мог:

  1. Разрешить прокрутку содержимого UIScrollView, чтобы увидеть другие текстовые поля после вызова клавиатуры

  2. Автоматически «прыгать» (путем прокрутки вверх) или сокращения

Я знаю, что мне нужен UIScrollView. Я попытался изменить класс моего UIView на UIScrollView, но я все еще не могу прокрутить текстовые поля вверх или вниз.

Мне нужны и UIView, и UIScrollView? Один входит в другой?

Что необходимо реализовать для автоматической прокрутки к активному текстовому полю?

В идеале, максимально возможная настройка компонентов будет выполнена в Интерфейсном Разработчике. Я хотел бы написать код только для того, что ему нужно.

Примечание: UIView (или UIScrollView), с которым я работаю, вызывается панелью вкладок (UITabBar), которая должна функционировать как обычно.


Редактировать: я добавляю полосу прокрутки только для того, когда клавиатура появляется. Хотя это и не нужно, я чувствую, что он обеспечивает лучший интерфейс, потому что тогда пользователь может, например, прокручивать и изменять текстовые поля.

У меня это работает, когда я меняю размер кадра UIScrollView, когда клавиатура поднимается и опускается. Я просто использую:

-(void)textFieldDidBeginEditing:(UITextField *)textField { 
    //Keyboard becomes visible
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
                     scrollView.frame.origin.y, 
scrollView.frame.size.width,
scrollView.frame.size.height - 215 + 50);   //resize
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   //keyboard will hide
    scrollView.frame = CGRectMake(scrollView.frame.origin.x, 
       scrollView.frame.origin.y, 
     scrollView.frame.size.width,
      scrollView.frame.size.height + 215 - 50); //resize
}

Однако это автоматически не «сдвигает» и не центрирует нижние текстовые поля в видимой области, что мне бы очень хотелось.

Ответы [ 91 ]

1015 голосов
/ 14 июля 2009
  1. Вам понадобится ScrollView только в том случае, если имеющееся у вас содержимое не помещается на экране iPhone. (Если вы добавляете ScrollView в качестве суперпредставления компонентов. Просто, чтобы сделать прокрутку TextField вверх при появлении клавиатуры, тогда это не нужно.)

  2. Для отображения textfields, не будучи скрытым клавиатурой, стандартным способом является перемещение вверх / вниз по представлению с текстовыми полями при отображении клавиатуры.

Вот пример кода:

#define kOFFSET_FOR_KEYBOARD 80.0

-(void)keyboardWillShow {
    // Animate the current view out of the way
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)keyboardWillHide {
    if (self.view.frame.origin.y >= 0)
    {
        [self setViewMovedUp:YES];
    }
    else if (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if ([sender isEqual:mailTf])
    {
        //move the main view, so that the keyboard does not hide it.
        if  (self.view.frame.origin.y >= 0)
        {
            [self setViewMovedUp:YES];
        }
    }
}

//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMovedUp:(BOOL)movedUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // if you want to slide up the view

    CGRect rect = self.view.frame;
    if (movedUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard 
        // 2. increase the size of the view so that the area behind the keyboard is covered up.
        rect.origin.y -= kOFFSET_FOR_KEYBOARD;
        rect.size.height += kOFFSET_FOR_KEYBOARD;
    }
    else
    {
        // revert back to the normal state.
        rect.origin.y += kOFFSET_FOR_KEYBOARD;
        rect.size.height -= kOFFSET_FOR_KEYBOARD;
    }
    self.view.frame = rect;

    [UIView commitAnimations];
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                             name:UIKeyboardWillHideNotification
                                           object:nil];
}
445 голосов
/ 24 апреля 2010

У меня также было много проблем с UIScrollView составлением нескольких UITextFields, из которых один или несколько из них были бы скрыты клавиатурой при редактировании.

Вот некоторые вещи, которые следует учитывать, если ваша UIScrollView не прокручивается должным образом.

1) Убедитесь, что ваш размер содержимого больше размера UIScrollView. Способ понять UIScrollViews состоит в том, что UIScrollView подобен окну просмотра контента, определенного в contentSize. Поэтому, когда UIScrollview прокручивается куда-либо, contentSize должен быть больше, чем UIScrollView. Иначе, прокрутка не требуется, так как все, что определено в contentSize, уже видно. Кстати, contentSize по умолчанию = CGSizeZero.

2) Теперь, когда вы понимаете, что UIScrollView действительно является окном в вашем «контенте», способ убедиться, что клавиатура не заслоняет ваше «1017 * окно просмотра», состоит в изменении размера UIScrollView поэтому, когда клавиатура присутствует, у вас есть окно UIScrollView, размер которого соответствует исходному UIScrollView frame.size.height минус высота клавиатуры. Это гарантирует, что ваше окно будет только этой маленькой видимой областью.

3) Вот подвох: когда я впервые это реализовал, я подумал, что мне нужно получить CGRect отредактированного текстового поля и вызвать UIScrollView's scrollRecToVisible метод. Я реализовал метод UITextFieldDelegate textFieldDidBeginEditing с вызовом метода scrollRecToVisible. Это на самом деле работало со странным побочным эффектом, что прокрутка защелкивала UITextField в положение. Долгое время я не мог понять, что это было. Затем я прокомментировал метод textFieldDidBeginEditing Delegate, и все это работает !! (???). Как выяснилось, я считаю, что UIScrollView фактически неявно переносит отредактированный в настоящее время UITextField в видимое окно. Моя реализация метода UITextFieldDelegate и последующий вызов scrollRecToVisible были излишними и стали причиной странного побочного эффекта.

Итак, вот шаги для правильной прокрутки UITextField в UIScrollView на место при появлении клавиатуры.

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:self.view.window];
    // register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:self.view.window];
    keyboardIsShown = NO;
    //make contentSize bigger than your scrollSize (you will need to figure out for your own use case)
    CGSize scrollContentSize = CGSizeMake(320, 345);
    self.scrollView.contentSize = scrollContentSize;
}

- (void)keyboardWillHide:(NSNotification *)n
{
    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;


    // resize the scrollview
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height += (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];

    keyboardIsShown = NO;
}

- (void)keyboardWillShow:(NSNotification *)n
{
    // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown.  This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`.  If we were to resize the `UIScrollView` again, it would be disastrous.  NOTE: The keyboard notification will fire even when the keyboard is already shown.
    if (keyboardIsShown) {
        return;
    }

    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    // resize the noteView
    CGRect viewFrame = self.scrollView.frame;
    // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
    viewFrame.size.height -= (keyboardSize.height - kTabBarHeight);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.scrollView setFrame:viewFrame];
    [UIView commitAnimations];
    keyboardIsShown = YES;
}
  1. Зарегистрируйтесь для получения уведомлений клавиатуры на viewDidLoad
  2. Отменить регистрацию для клавиатурных сообщений на viewDidUnload
  3. Убедитесь, что contentSize установлено и больше, чем UIScrollView на viewDidLoad
  4. Сжатие UIScrollView при наличии клавиатуры
  5. Вернуть назад UIScrollView, когда клавиатура исчезнет.
  6. Используйте ivar, чтобы определить, отображается ли уже клавиатура на экране, поскольку уведомления клавиатуры отправляются каждый раз, когда вкладка UITextField даже если клавиатура уже присутствует, чтобы избежать сжатия UIScrollView когда оно уже уменьшилось

Следует отметить, что UIKeyboardWillShowNotification будет срабатывать, даже если клавиатура уже находится на экране, когда вы нажимаете на другую UITextField. Я позаботился об этом, используя ivar, чтобы избежать изменения размера UIScrollView, когда клавиатура уже на экране. Непреднамеренное изменение размера UIScrollView, когда клавиатура уже есть, приведет к катастрофическим последствиям!

Надеюсь, этот код избавит некоторых из вас от головной боли.

269 голосов
/ 29 января 2011

На самом деле лучше всего использовать реализацию Apple, как указано в документах . Однако код, который они предоставляют, неисправен. Замените часть, найденную в keyboardWasShown: чуть ниже комментариев, следующим текстом:

NSDictionary* info = [aNotification userInfo];
CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];
CGSize kbSize =keyPadFrame.size;
CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];
CGRect aRect = self.view.bounds;
aRect.size.height -= (kbSize.height);

CGPoint origin =  activeRect.origin;
origin.y -= backScrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin)) {
    CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));
    [backScrollView setContentOffset:scrollPoint animated:YES];
}

Проблемы с кодом Apple: (1) Они всегда вычисляют, находится ли точка в рамке вида, но это ScrollView, поэтому она, возможно, уже прокрутилась, и вам необходимо учесть это смещение:

origin.y -= scrollView.contentOffset.y

(2) Они смещают contentOffset на высоту клавиатуры, но мы хотим наоборот (мы хотим сместить contentOffset на высоту, которая видна на экране, а не то, что нет):

activeField.frame.origin.y-(aRect.size.height)
244 голосов
/ 02 августа 2011

В textFieldDidBeginEditting и textFieldDidEndEditing вызовите функцию [self animateTextField:textField up:YES] следующим образом:

-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self animateTextField:textField up:YES]; 
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField:textField up:NO];
}

-(void)animateTextField:(UITextField*)textField up:(BOOL)up
{
    const int movementDistance = -130; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? movementDistance : -movementDistance); 

    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

Надеюсь, этот код поможет вам.

In Swift 2

func animateTextField(textField: UITextField, up: Bool) 
{
     let movementDistance:CGFloat = -130
     let movementDuration: Double = 0.3

     var movement:CGFloat = 0
     if up 
     {
         movement = movementDistance
     }
     else 
     {
         movement = -movementDistance
     }
     UIView.beginAnimations("animateTextField", context: nil)
     UIView.setAnimationBeginsFromCurrentState(true)
     UIView.setAnimationDuration(movementDuration)
     self.view.frame = CGRectOffset(self.view.frame, 0, movement)
     UIView.commitAnimations()
}


func textFieldDidBeginEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:true)
}

func textFieldDidEndEditing(textField: UITextField) 
{
    self.animateTextField(textField, up:false)
}

SWIFT 3

 func animateTextField(textField: UITextField, up: Bool)
    {
        let movementDistance:CGFloat = -130
        let movementDuration: Double = 0.3

        var movement:CGFloat = 0
        if up
        {
            movement = movementDistance
        }
        else
        {
            movement = -movementDistance
        }
        UIView.beginAnimations("animateTextField", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration)
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }


    func textFieldDidBeginEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:true)
    }

    func textFieldDidEndEditing(textField: UITextField)
    {
        self.animateTextField(textField: textField, up:false)
    }
134 голосов
/ 01 декабря 2012

Просто используя TextFields:

1a) Использование Interface Builder: выбрать все текстовые поля => Изменить => Вставить => ScrollView

1b) Внедрение TextFields вручную в UIScrollView, называемое scrollView

2) Набор UITextFieldDelegate

3) Установите каждый textField.delegate = self; (или выполните соединения в Interface Builder)

4) Копирование / вставка:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
    [scrollView setContentOffset:scrollPoint animated:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [scrollView setContentOffset:CGPointZero animated:YES];
}
113 голосов
/ 17 июля 2013

Для Универсальное решение , вот мой подход к реализации IQKeyboardManager .

enter image description here

Шаг 1: - I Добавлены глобальные уведомления UITextField, UITextView и UIKeyboard в одноэлементном классе. Я называю это IQKeyboardManager .

Step2: - Если найдены уведомления UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotification или UITextViewTextDidBeginEditingNotification, я пытаюсь получить экземпляр topMostViewController из иерархии UIWindow.rootViewController. Для того, чтобы правильно раскрыть UITextField / UITextView на нем, необходимо отрегулировать рамку topMostViewController.view.

Шаг 3: - Я рассчитал ожидаемое расстояние перемещения topMostViewController.view относительно первого ответа UITextField / UITextView.

Шаг 4: - Я переместился topMostViewController.view.frame вверх / вниз в соответствии с ожидаемым расстоянием перемещения.

Шаг 5: - Если найдено уведомление UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotification или UITextViewTextDidEndEditingNotification, я снова пытаюсь получить экземпляр topMostViewController из иерархии UIWindow.rootViewController.

Шаг 6: - Я рассчитал нарушенное расстояние topMostViewController.view, которое необходимо восстановить в исходное положение.

Шаг 7: - Я восстановил topMostViewController.view.frame вниз в соответствии с нарушенным расстоянием.

Шаг 8: - Я создал экземпляр синглтона IQKeyboardManager Экземпляр класса при загрузке приложения, поэтому каждый UITextField / UITextView в приложении будет автоматически корректироваться в соответствии с ожидаемым расстоянием перемещения.

Это все IQKeyboardManager для вас с НЕТ ЛИНЕЙКИ КОДА действительно !! нужно только перетащить связанный исходный файл в проект. IQKeyboardManager также поддерживает Ориентация устройства , Автоматическое управление UIToolbar , KeybkeyboardDistanceFromTextField и намного больше, чем вы думаете.

101 голосов
/ 12 апреля 2011

Я собрал универсальный выпадающий подкласс UIScrollView, UITableView и даже UICollectionView, который заботится о перемещении всех текстовых полей внутри него с клавиатуры.

Когда клавиатура должна появиться, подкласс найдет подпредставление, которое должно быть отредактировано, и отрегулирует его фрейм и смещение содержимого, чтобы убедиться, что представление является видимым, с анимацией, соответствующей всплывающей клавиатуре. Когда клавиатура исчезает, она восстанавливает свой прежний размер.

Он должен работать практически с любой настройкой, либо с интерфейсом на основе UITableView, либо с интерфейсом, состоящим из представлений, размещенных вручную.

Здесь 'tis: решение для перемещения текстовых полей с клавиатуры

87 голосов
/ 30 апреля 2015

Для Swift Программисты:

Это все сделает за вас, просто поместите их в ваш класс контроллера представления и реализуйте UITextFieldDelegate в вашем контроллере представления и установите делегата textField на self

textField.delegate = self // Setting delegate of your UITextField to self

Реализация методов обратного вызова делегата:

func textFieldDidBeginEditing(textField: UITextField) {
    animateViewMoving(true, moveValue: 100)
}

func textFieldDidEndEditing(textField: UITextField) {
    animateViewMoving(false, moveValue: 100)
}

// Lifting the view up
func animateViewMoving (up:Bool, moveValue :CGFloat){
    let movementDuration:NSTimeInterval = 0.3
    let movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}
64 голосов
/ 01 марта 2013

Ответов уже много, но ни одно из вышеприведенных решений не имело всех причудливых средств позиционирования, необходимых для «идеальной» безошибочной, обратно совместимой и не мерцающей анимации. (ошибка при анимации frame / bounds и contentOffset вместе, различные ориентации интерфейса, разделенная клавиатура iPad, ...)
Позвольте мне поделиться своим решением:
(при условии, что вы настроили UIKeyboardWill(Show|Hide)Notification)

// Called when UIKeyboardWillShowNotification is sent
- (void)keyboardWillShow:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = [notification userInfo];

    CGRect keyboardFrameInWindow;
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrameInWindow];

    // the keyboard frame is specified in window-level coordinates. this calculates the frame as if it were a subview of our view, making it a sibling of the scroll view
    CGRect keyboardFrameInView = [self.view convertRect:keyboardFrameInWindow fromView:nil];

    CGRect scrollViewKeyboardIntersection = CGRectIntersection(_scrollView.frame, keyboardFrameInView);
    UIEdgeInsets newContentInsets = UIEdgeInsetsMake(0, 0, scrollViewKeyboardIntersection.size.height, 0);

    // this is an old animation method, but the only one that retains compaitiblity between parameters (duration, curve) and the values contained in the userInfo-Dictionary.
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    _scrollView.contentInset = newContentInsets;
    _scrollView.scrollIndicatorInsets = newContentInsets;

    /*
     * Depending on visual layout, _focusedControl should either be the input field (UITextField,..) or another element
     * that should be visible, e.g. a purchase button below an amount text field
     * it makes sense to set _focusedControl in delegates like -textFieldShouldBeginEditing: if you have multiple input fields
     */
    if (_focusedControl) {
        CGRect controlFrameInScrollView = [_scrollView convertRect:_focusedControl.bounds fromView:_focusedControl]; // if the control is a deep in the hierarchy below the scroll view, this will calculate the frame as if it were a direct subview
        controlFrameInScrollView = CGRectInset(controlFrameInScrollView, 0, -10); // replace 10 with any nice visual offset between control and keyboard or control and top of the scroll view.

        CGFloat controlVisualOffsetToTopOfScrollview = controlFrameInScrollView.origin.y - _scrollView.contentOffset.y;
        CGFloat controlVisualBottom = controlVisualOffsetToTopOfScrollview + controlFrameInScrollView.size.height;

        // this is the visible part of the scroll view that is not hidden by the keyboard
        CGFloat scrollViewVisibleHeight = _scrollView.frame.size.height - scrollViewKeyboardIntersection.size.height;

        if (controlVisualBottom > scrollViewVisibleHeight) { // check if the keyboard will hide the control in question
            // scroll up until the control is in place
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y += (controlVisualBottom - scrollViewVisibleHeight);

            // make sure we don't set an impossible offset caused by the "nice visual offset"
            // if a control is at the bottom of the scroll view, it will end up just above the keyboard to eliminate scrolling inconsistencies
            newContentOffset.y = MIN(newContentOffset.y, _scrollView.contentSize.height - scrollViewVisibleHeight);

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        } else if (controlFrameInScrollView.origin.y < _scrollView.contentOffset.y) {
            // if the control is not fully visible, make it so (useful if the user taps on a partially visible input field
            CGPoint newContentOffset = _scrollView.contentOffset;
            newContentOffset.y = controlFrameInScrollView.origin.y;

            [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code
        }
    }

    [UIView commitAnimations];
}


// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillHide:(NSNotification*)notification
{
    // if we have no view or are not visible in any window, we don't care
    if (!self.isViewLoaded || !self.view.window) {
        return;
    }

    NSDictionary *userInfo = notification.userInfo;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    // undo all that keyboardWillShow-magic
    // the scroll view will adjust its contentOffset apropriately
    _scrollView.contentInset = UIEdgeInsetsZero;
    _scrollView.scrollIndicatorInsets = UIEdgeInsetsZero;

    [UIView commitAnimations];
}
62 голосов
/ 06 ноября 2010

Шиун сказал: «Как оказалось, я полагаю, что UIScrollView фактически неявно переносит в настоящий момент отредактированный UITextField в видимое окно». Это похоже на iOS 3.1.3, но не 3.2, 4.0 или 4.1. Мне пришлось добавить явный scrollRectToVisible, чтобы сделать UITextField видимым на iOS> = 3.2.

...