Как заставить UITextField двигаться вверх, когда клавиатура присутствует?

С iPhone SDK:

У меня есть UIView с UITextFields, который вызывает клавиатуру. Мне нужно это, чтобы иметь возможность:

  • Разрешить прокрутку содержимого UIScrollView для просмотра других текстовых полей после поднятия клавиатуры.

  • Автоматически "прыгать" (путем прокрутки) или сокращения

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

Нужно ли мне UIView и a UIScrollView? Один идет внутри другого? [EDIT: теперь я знаю, что вы хотите UIView внутри UIScrollView, и трюк состоит в том, чтобы программно установить размер содержимого UIScrollView в размере кадра UIView.]

Затем что нужно реализовать, чтобы автоматически перейти к активному текстовому полю?

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

Примечание. 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
}

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

1524
задан philfreo 14 июля '09 в 20:06
источник поделиться
87 ответов
  • 1
  • 2
  • 3
  • Вам понадобится только ScrollView, если содержимое, которое у вас сейчас, не помещается на экране iPhone. (Если вы добавляете ScrollView в качестве супервизора компонентов, просто чтобы TextField прокручивалась вверх, когда клавиатура поднималась, тогда она не нужна.)

  • Чтобы показать 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 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];
}
949
ответ дан RPDP 14 июля '09 в 21:03
источник поделиться

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

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

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

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

3) Здесь catch: Когда я впервые это сделал, я решил, что мне нужно будет получить 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;
}
  • Зарегистрируйтесь для уведомлений о клавиатуре на viewDidLoad
  • Отменить регистрацию клавиатурных nofitications на viewDidUnload
  • Убедитесь, что contentSize установлен и больше, чем ваш UIScrollView на viewDidLoad
  • Сжатие UIScrollView при наличии клавиатуры
  • Верните назад UIScrollView, когда клавиатура уходит.
  • Используйте ivar, чтобы определить, отображается ли клавиатура на экране, поскольку уведомления о клавиатуре отправляются каждый раз, когда вкладка UITextField имеет вкладку, даже если клавиатура уже присутствует, чтобы избежать сокращения UIScrollView, когда она уже сжата

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

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

429
ответ дан Shiun 24 апр. '10 в 11:31
источник поделиться

На самом деле лучше всего использовать реализацию Apple, как это предусмотрено в docs. Однако код, который они предоставляют, неисправен. Замените часть, найденную в 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)
256
ответ дан DK_ 29 янв. '11 в 17:56
источник поделиться

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

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

В 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)
    }
235
ответ дан sumanthkodi 02 авг. '11 в 9:48
источник поделиться

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

1a) С помощью Interface Builder: выберите All TextFields = > Edit = > Embed In = > ScrollView

1b) Встраивание текстовых полей вручную в 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];
}
133
ответ дан DAS 01 дек. '12 в 17:53
источник поделиться

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

enter image description here

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

Шаг 2: - Если найдено 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: - Я создал экземпляр singleton IQKeyboardManager для загрузки приложения, поэтому каждый UITextField/UITextView в приложение будет автоматически настраиваться в соответствии с ожидаемым расстоянием перемещения.

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

103
ответ дан Mohd Iftekhar Qurashi 17 июля '13 в 21:18
источник поделиться

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

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

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

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

98
ответ дан Michael Tyson 12 апр. '11 в 14:33
источник поделиться

Для 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()
}
83
ответ дан Satnam Sync 30 апр. '15 в 14:21
источник поделиться

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

59
ответ дан cbranch 06 нояб. '10 в 8:25
источник поделиться

Есть уже много ответов, но все же ни один из вышеперечисленных решений не обладал фантастическим позиционированием, необходимым для "идеальной" без ошибок, обратной совместимости и без мерцания анимации. (ошибка при анимации кадров/границ и 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];
}
59
ответ дан Martin Ullrich 01 марта '13 в 22:41
источник поделиться

В этом документе описывается решение этой проблемы. Посмотрите исходный код в разделе "Перемещение содержимого, находящегося под клавиатурой". Это довольно просто.

РЕДАКТИРОВАТЬ: В этом примере заметен сбой. Вероятно, вы захотите слушать UIKeyboardWillHideNotification вместо UIKeyboardDidHideNotification. В противном случае прокрутка позади клавиатуры будет обрезана на время анимации закрытия клавиатуры.

43
ответ дан Mihai Damian 28 окт. '10 в 15:37
источник поделиться

Можно подумать, хотите ли вы когда-либо использовать UITextField самостоятельно. Я не сталкивался с любыми хорошо разработанными приложениями для iPhone, которые на самом деле используют UITextFields вне UITableViewCells.

Это будет какая-то дополнительная работа, но я рекомендую вам реализовать все представления ввода данных в виде таблиц. Добавьте UITextView к вашему UITableViewCells.

42
ответ дан Jonathan Sterling 20 июля '09 в 11:18
источник поделиться

Самое быстрое найденное решение

- (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 = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

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

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}
30
ответ дан Nepster 25 окт. '14 в 14:10
источник поделиться

Небольшое исправление, которое работает для многих UITextFields

#pragma mark UIKeyboard handling

#define kMin 150

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
   if (currTextField) {
      [currTextField release];
   }
   currTextField = [sender retain];
   //move the main view, so that the keyboard does not hide it.
   if (self.view.frame.origin.y + currTextField.frame.origin. y >= kMin) {
        [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 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 = kMin - currTextField.frame.origin.y ;
   }
   else
   {
      // revert back to the normal state.
      rect.origin.y = 0;
   }
   self.view.frame = rect;

   [UIView commitAnimations];
}


- (void)keyboardWillShow:(NSNotification *)notif
{
   //keyboard will be shown now. depending for which textfield is active, move up or move down the view appropriately

   if ([currTextField isFirstResponder] && currTextField.frame.origin.y + self.view.frame.origin.y >= kMin)
   {
      [self setViewMovedUp:YES];
   }
   else if (![currTextField isFirstResponder] && currTextField.frame.origin.y  + self.view.frame.origin.y < kMin)
   {
      [self setViewMovedUp:NO];
   }
}

- (void)keyboardWillHide:(NSNotification *)notif
{
   //keyboard will be shown now. depending for which textfield is active, move up or move down the view appropriately
   if (self.view.frame.origin.y < 0 ) {
      [self setViewMovedUp:NO];
   }

}


- (void)viewWillAppear:(BOOL)animated
{
   // register for keyboard notifications
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) 
                                                name:UIKeyboardWillShowNotification object:self.view.window]; 
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) 
                                                name:UIKeyboardWillHideNotification object:self.view.window]; 
}

- (void)viewWillDisappear:(BOOL)animated
{
   // unregister for keyboard notifications while not visible.
   [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
}
29
ответ дан tt.Kilew 11 февр. '10 в 14:18
источник поделиться

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

Разве его следующий код не должен возвращать представление?

else
{
    // revert back to the normal state.
    rect.origin.y += kOFFSET_FOR_KEYBOARD;
    rect.size.height -= kOFFSET_FOR_KEYBOARD;
}
26
ответ дан Steve 05 февр. '10 в 21:27
источник поделиться

Я не уверен, что если переместить представление вверх, это правильный подход, я сделал это другим способом, изменив размер UIScrollView. Я подробно объяснил это в небольшом статье

21
ответ дан Jose Muanis 10 янв. '10 в 17:38
источник поделиться

Чтобы вернуться в исходное состояние просмотра, добавьте:

-(void)textFieldDidEndEditing:(UITextField *)sender

{
    //move the main view, so that the keyboard does not hide it.
    if  (self.view.frame.origin.y < 0)
    {
        [self setViewMovedUp:NO];
    }
}
19
ответ дан Nicolas Marchand 10 февр. '10 в 19:30
источник поделиться

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

@interface RegistrationViewController : UIViewController <UITextFieldDelegate>{
    UITextField* activeField;
    UIScrollView *scrollView;
}
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];

    //scrool view must be under main view - swap it
    UIView* natView = self.view;
    [self setView:scrollView];
    [self.view addSubview:natView];

    CGSize scrollViewContentSize = self.view.frame.size;
    [scrollView setContentSize:scrollViewContentSize];

    [self registerForKeyboardNotifications];
}

- (void)viewDidUnload {
    activeField = nil;
    scrollView = nil;
    [self unregisterForKeyboardNotifications];
    [super viewDidUnload];
}

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShown:)
                                                 name:UIKeyboardWillShowNotification object:nil];

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

}

-(void)unregisterForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillShowNotification
                                                  object:nil];
    // unregister for keyboard notifications while not visible.
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIKeyboardWillHideNotification
                                                  object:nil];
}

- (void)keyboardWillShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect frame = self.view.frame;
    frame.size.height -= kbSize.height;
    CGPoint fOrigin = activeField.frame.origin;
    fOrigin.y -= scrollView.contentOffset.y;
    fOrigin.y += activeField.frame.size.height;
    if (!CGRectContainsPoint(frame, fOrigin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y + activeField.frame.size.height - frame.size.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
     [scrollView setContentOffset:CGPointZero animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    activeField = nil;
}

-(BOOL) textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

P.S: Я надеюсь, что код поможет кому-то сделать желаемый эффект быстро. (Xcode 4.5)

18
ответ дан HotJard 12 окт. '12 в 12:14
источник поделиться

попробуйте этот короткий трюк...

 - (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 = textField.frame.origin.y / 2; // tweak as needed
        const float movementDuration = 0.3f; // tweak as needed

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

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

Счастливое кодирование:)....

17
ответ дан Sourabh Sharma 11 мая '15 в 16:32
источник поделиться

@user271753

Чтобы вернуться к исходному, добавьте:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
   [textField resignFirstResponder];
   [self setViewMovedUp:NO];
   return YES;
}
17
ответ дан user436179 29 окт. '10 в 11:32
источник поделиться

Для перемещения рамки просмотра не требуется просмотр прокрутки. Вы можете изменить рамку представления viewcontroller's, чтобы весь вид перемещался настолько, чтобы помещать текстовое поле firstresponder над клавиатурой. Когда я столкнулся с этой проблемой, я создал подкласс UIViewController, который делает это. Он замечает, что на клавиатуре появится уведомление и обнаружит первый ответчик subview и (при необходимости) он оживляет основной вид вверх настолько, чтобы первый ответчик находился выше клавиатуры. Когда клавиатура скрывается, она оживляет вид назад, где он был.

Чтобы использовать этот подкласс, сделайте свой пользовательский контроллер представлений подклассом GMKeyboardVC и он наследует эту функцию (просто убедитесь, что вы реализуете viewWillAppear и viewWillDisappear они должны вызвать супер). Класс находится на github.

15
ответ дан progrmr 10 сент. '11 в 17:43
источник поделиться

В соответствии с документами, начиная с iOS 3.0, класс UITableViewController автоматически изменяет размеры и перетаскивает его представление таблицы при редактировании текстовых полей. Я думаю, этого недостаточно, чтобы помещать текстовое поле внутри UITableViewCell, как указывали некоторые.

Из документов:

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

12
ответ дан Dheeraj V.S. 04 окт. '12 в 5:44
источник поделиться

Здесь я нашел простейшее решение для обработки клавиатуры.

Вам нужно просто скопировать-вставить ниже пример кода и изменить текстовое поле или любое представление, которое вы хотите переместить вверх.

Шаг-1

Просто скопируйте пасту ниже двух методов в вашем контроллере

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

- (void)deregisterFromKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

Шаг-2

зарегистрировать и отменить регистрацию уведомлений о клавиатуре в viewWillAppear и viewWillDisappear соответственно.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self registerForKeyboardNotifications];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [self deregisterFromKeyboardNotifications];
    [super viewWillDisappear:animated];
}

Шаг-3

Здесь приходит душа, просто замените текстовое поле и измените высоту, сколько вы хотите двигаться вверх.

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

    //you need replace your textfield instance here
    CGPoint textFieldOrigin = self.tokenForPlaceField.frame.origin;
    CGFloat textFieldHeight = self.tokenForPlaceField.frame.size.height;

    CGRect visibleRect = self.view.frame;
    visibleRect.size.height -= currentKeyboardSize.height;

    if (!CGRectContainsPoint(visibleRect, textFieldOrigin))
    {
        //you can add yor desired height how much you want move keypad up, by replacing "textFieldHeight" below

        CGPoint scrollPoint = CGPointMake(0.0, textFieldOrigin.y - visibleRect.size.height  + textFieldHeight); //replace textFieldHeight to currentKeyboardSize.height, if you want to move up with more height
        [self.scrollView setContentOffset:scrollPoint animated:YES];
    }
}

- (void)keyboardWillBeHidden:(NSNotification *)notification
{
    [self.scrollView setContentOffset:CGPointZero animated:YES];
}

Ссылка: хорошо, Пожалуйста, оцените этот парень, который поделился этим красивым отрывом кода, чистым решением.

Надеюсь, это было бы очень полезно кому-то там.

11
ответ дан swiftBoy 19 авг. '15 в 20:45
источник поделиться

Вот решение для взлома, которое я разработал для конкретного макета. Это решение похоже на решение Мэтта Галлахера, в котором прокручивается секция. Я до сих пор не знаком с разработкой iPhone и не знаю, как работают макеты. Таким образом, этот хак.

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

У меня был UIView с высотой 775. Элементы управления распределены в основном группами по 3 на большом пространстве. Я закончил со следующей версией IB.

UIView -> UIScrollView -> [UI Components]

Вот взлом

Я установил высоту UIScrollView на 500 единиц больше, чем фактический макет (1250). Затем я создал массив с абсолютными позициями, которые мне нужно прокрутить, и простую функцию для их получения на основе номера метки IB.

static NSInteger stepRange[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 140, 140, 410
};

NSInteger getScrollPos(NSInteger i) {
    if (i < TXT_FIELD_INDEX_MIN || i > TXT_FIELD_INDEX_MAX) {
        return 0 ;
    return stepRange[i] ;
}

Теперь все, что вам нужно сделать, это использовать следующие две строки кода в textFieldDidBeginEditing и textFieldShouldReturn (последний, если вы создаете следующую навигацию по полю)

CGPoint point = CGPointMake(0, getScrollPos(textField.tag)) ;
[self.scrollView setContentOffset:point animated:YES] ;

Пример.

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    CGPoint point = CGPointMake(0, getScrollPos(textField.tag)) ;
    [self.scrollView setContentOffset:point animated:YES] ;
}


- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    NSInteger nextTag = textField.tag + 1;
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];

    if (nextResponder) {
        [nextResponder becomeFirstResponder];
        CGPoint point = CGPointMake(0, getScrollPos(nextTag)) ;
        [self.scrollView setContentOffset:point animated:YES] ;
    }
    else{
        [textField resignFirstResponder];
    }

    return YES ;
}

Этот метод не выполняет "прокрутку назад", как это делают другие методы. Это не было требованием. Снова это было для довольно "высокого" UIView, и у меня не было дней, чтобы изучить внутренние механизмы компоновки.

11
ответ дан Steve McFarlin 29 марта '10 в 0:24
источник поделиться

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

В примере MIScrollView.h внизу учебника обязательно поставьте пробел в

@property (nonatomic, retain) id backgroundTapDelegate;

как вы видите.

9
ответ дан savagenoob 01 янв. '12 в 22:23
источник поделиться

Используйте эту третью сторону, вам не нужно писать даже одну строку

https://github.com/hackiftekhar/IQKeyboardManager

загрузить проект и перетащить IQKeyboardManager в ваш проект. Если вы обнаружили какую-либо проблему, прочитайте документ README.

Ребята действительно снимают головную боль, чтобы управлять клавиатурой.

Спасибо и удачи!

9
ответ дан Arvind Kumar 12 окт. '15 в 12:43
источник поделиться

Когда UITextField находится в UITableViewCell, прокрутка должна автоматически настраиваться.

Если это не так, возможно, из-за неправильного кода/настройки таблицы.

Например, когда я перезагрузил свой длинный стол одним UITextField внизу следующим образом,

-(void) viewWillAppear:(BOOL)animated
{
   [self.tableview reloadData];
}

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

Чтобы исправить это, я должен был сделать это -

-(void) viewWillAppear:(BOOL)animated
{
    //add the following line to fix issue
    [super viewWillAppear:animated];
    [self.tableview reloadData];
}
9
ответ дан lakersgonna3peat 09 марта '11 в 4:06
источник поделиться

Примечание: этот ответ предполагает, что ваш textField находится в scrollView.

Я предпочитаю иметь дело с этим, используя scrollContentInset и scrollContentOffset вместо того, чтобы возиться с рамками моего представления.

Сначала давайте прослушать уведомления о клавиатуре

//call this from viewWillAppear
-(void)addKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
}
//call this from viewWillDisappear
-(void)removeKeyboardNotifications{
    [[NSNotificationCenter default
    Center] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

Следующий шаг - сохранить свойство, которое представляет текущий первый ответчик (UITextfield/UITextVIew, который в настоящее время имеет клавиатуру).

Мы используем методы делегата для установки этого свойства. Если вы используете другой компонент, вам понадобится нечто подобное.

Обратите внимание, что для текстового поля мы устанавливаем его в файле doBeginEditing и для textView в shouldBeginEditing. Это связано с тем, что textViewDidBeginEditing вызывается после UIKeyboardWillShowNotification по какой-то причине.

-(BOOL)textViewShouldBeginEditing:(UITextView * )textView{
    self.currentFirstResponder = textView;
    return YES;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    self.currentFirstResponder = textField;
}

Наконец, здесь волшебство

- (void)keyboardWillShow:(NSNotification*)aNotification{
    NSDictionary* info = [aNotification userInfo];
    CGRect kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];


    /*if currentFirstResponder is overlayed by the keyboard, move it so it bottom ends where the keyboard begins*/
    if(self.currentFirstResponder){

        //keyboard origin in currentFirstResponderFrame
        CGPoint keyboardOrigin = [self.currentFirstResponder convertPoint:kbFrame.origin fromView:nil];

        float spaceBetweenFirstResponderAndKeyboard = abs(self.currentFirstResponder.frame.size.height-keyboardOrigin.y);

        //only scroll the scrollview if keyboard overlays the first responder
        if(spaceBetweenFirstResponderAndKeyboard>0){
            //if i call setContentOffset:animate:YES it behaves differently, not sure why
            [UIView animateWithDuration:0.25 animations:^{
                [self.scrollView setContentOffset:CGPointMake(0,self.scrollView.contentOffset.y+spaceBetweenFirstResponderAndKeyboard)];
            }];
        }
    }

    //set bottom inset to the keyboard height so you can still scroll the whole content

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0);
    _scrollView.contentInset = contentInsets;
    _scrollView.scrollIndicatorInsets = contentInsets;

}

- (void)keyboardWillHide:(NSNotification*)aNotification{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    _scrollView.contentInset = contentInsets;
    _scrollView.scrollIndicatorInsets = contentInsets;
}
7
ответ дан Juraj Petrik 02 июля '14 в 23:06
источник поделиться

Попробуйте следующее:

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
    if ([sender isEqual:self.m_Sp_Contact])
    {
        [self.m_Scroller setContentOffset:CGPointMake(0, 105)animated:YES];          
    }
}
7
ответ дан user1105624 20 июля '12 в 10:34
источник поделиться

Swift 2.0:

Добавьте UIScrollView и добавьте textFields вверху. Сделайте ссылки на раскадровку на VC.

@IBOutlet weak var username: UITextField!
@IBOutlet weak var password: UITextField!
@IBOutlet weak var scrollView: UIScrollView!

Добавьте следующие методы: UITextFieldDelegate и UIScrollViewDelegate.

//MARK:- TEXTFIELD METHODS
    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if(username.returnKeyType == UIReturnKeyType.Default) {
            password.becomeFirstResponder()
        }
        textField.resignFirstResponder()
        return true
    }
    func textFieldDidBeginEditing(textField: UITextField) {

        dispatch_async(dispatch_get_main_queue()) {

            let scrollPoint:CGPoint = CGPointMake(0,textField.frame.origin.y/4)
            self.scrollView!.setContentOffset(scrollPoint, animated: true);
        }
    }
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {

        dispatch_async(dispatch_get_main_queue()) {
          UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true) })
        }
        return true
    }
    override func touchesBegan(touches: Set<UITouch>,
        withEvent event: UIEvent?) {
            self.view.endEditing(true)
    }
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        self.scrollView.scrollEnabled =  true

        dispatch_async(dispatch_get_main_queue()) {
            UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true)

            })
        }
    }
7
ответ дан Alvin George 16 февр. '16 в 11:58
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам