TextField прикрепляется к клавиатуре во время редактирования - как заставить ScrollView выглядеть так же, как и до редактирования?

Я создал новый проект с одним представлением Xcode. В построителе интерфейсов я добавил UIScrollView для полного просмотра. В этом прокрутке я добавил UITextField. В результате пользовательский интерфейс выглядел так: enter image description here

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

Теперь для приведения UITextField поверх клавиатуры во время редактирования я следил за способом, описанным Apple на странице " Управление клавиатурой". После этого он дал мне ожидаемое поведение, которое привело текстовое поле прямо над клавиатурой при редактировании, как показано на следующем скриншоте: enter image description here

Теперь, после вызова [textfield endEditing:YES], клавиатура скрывается сама, но текстовое поле не возвращается к исходному месту. Он возвращается в место чуть выше своего первоначального места, и теперь вид прокрутки становится прокручиваемым, как если бы к нему добавилась небольшая высота:

enter image description here

Обратите внимание на полосу прокрутки в приведенном выше снимке экрана!

Я хочу помочь вернуть исходное поведение представления после завершения редактирования (когда скрывается клавиатура), т.е. TextField, чтобы вернуться к тому же месту, и прокрутка должна происходить так, как это было не до начала редактирования.

URL проекта: https://github.com/therohansanap/keyboard.git

+1
источник поделиться
6 ответов

Я думаю, что официальный путь указан Apple, здесь является простым и лучшим способом сохранить эту функциональность работать.

+1
источник
You need adjust scrollview contentOffset textFieldDidBeginEditing and textFieldDidEndEditing.
or 
One controller is available for scrollview auto scroll.

https://github.com/simonbs/BSKeyboardControls

+1
источник

Вы можете сделать что-то подобное без использования уведомлений о клавиатуре. Поскольку вы, возможно, знаете, что у нас есть методы делегирования TextField, мы можем использовать их для установки scrollView contentOffset и получения такого же поведения

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    scrollView.contentOffset = CGPointMake(0, textField.center.y-80); // you can change 80 to whatever which fits your needs
}

приведенный выше метод устанавливает contentOffset Значение прокрутки, а ваш textFiled перемещается вверх, а textField resignFirstResponder textField resignFirstResponder ниже метод делегата, где вы можете вернуть значение contentOffset

- (void)textFieldDidEndEditing:(UITextField *)textField{
       scrollView.contentOffset = CGPointMake(0,-80);
}

Примечание. Вам нужно сделать каждое текстовое поле в своем представлении, чтобы его делегат был вашим экземпляром UIViewController. Вам также потребуется, чтобы ваш UIViewController принял UITextFieldDelegate

0
источник

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

//Handle notification when keyboard appear
- (void)keyboardOnScreen:(NSNotification *)notification
{
    if (_isKeyboardShow) {
        return; //If keyboard is showing then return
    }
    _keyboardHeight = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    [self animateTextFieldUp: YES];
    _isKeyboardShow = YES; 
}

//Handle notification when keyboard hide
- (void)keyboardOffScreen:(NSNotification *)notification
{
    if(!_isKeyboardShow) return;
    [self animateTextFieldUp: NO];
    _isKeyboardShow = NO;//Missed this line
}

//Push view up with animation when keyboard show
- (void) animateTextFieldUp: (BOOL) up
{
    UITextField *textfield = [UIResponder currentFirstResponder];
    CGPoint windowPoint = [textfield convertPoint:textfield.bounds.origin toView:self.view];
    int movementDistance;
    CGPoint point = [_mainScrollView contentOffset];

    //Push up only when blocked by keyboard
    if (windowPoint.y + textfield.frame.size.height >= self.view.frame.size.height - _keyboardHeight) {
        movementDistance = windowPoint.y - (self.view.frame.size.height - _keyboardHeight) +  textfield.frame.size.height + 10;
        _oldMovementDistance = movementDistance;
        int movement = (up ? -movementDistance : movementDistance);
    [_mainScrollView setContentOffset:CGPointMake(0, point.y - movement) animated:YES];
    }
    else { //Push view down the same amount
        int movement = (up ? -movementDistance : _oldMovementDistance);
        [_mainScrollView setContentOffset:CGPointMake(0, point.y - movement) animated:YES];
        _oldMovementDistance = 0;
    }
}
0
источник

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

Вот модифицированный код:

@interface ViewController () {
UITextField *activeField;
CGPoint scrollViewOldPosition;
}

Измените клавиатуруWasShow следующим образом:

// Called when the UIKeyboardDidShowNotification is sent.
 - (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;


CGFloat someSpaceBetweenKeyBoardAndField = 20.0;
scrollViewOldPosition = self.scrollView.contentOffset;

self.scrollView.contentOffset = CGPointMake(0, kbSize.height - (self.view.frame.size.height - activeField.frame.origin.y - activeField.frame.size.height) + someSpaceBetweenKeyBoardAndField);
}

Клавиатура будет скрыта:

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    self.scrollView.contentOffset = scrollViewOldPosition;
}
0
источник

переместите UITextField и UITextView с клавиатуры во время редактирования:

Для не-UITableViewControllers TPKeyboardAvoidingScrollView.h исходные файлы TPKeyboardAvoidingScrollView.m и TPKeyboardAvoidingScrollView.h в свой проект, введите UIScrollView в ваш контроллер xib или раскадровую панель управления представлением, установите класс прокрутки в TPKeyboardAvoidingScrollView и поместите все ваши элементы управления в это прокручивание. Вы также можете создавать его программно, без использования xib - просто используйте TPKeyboardAvoidingScrollView в качестве своего верхнего уровня.

Для использования с классами UITableViewController отмените TPKeyboardAvoidingTableView.m и TPKeyboardAvoidingTableView.h в свой проект и сделайте свой UITableView TPKeyboardAvoidingTableView в xib. Если вы не используете xib с контроллером, я не знаю простого способа сделать его UITableView специальным классом: путь наименьшего сопротивления - создать для него xib.

Вы можете получить ссылку отсюда.

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос