Подтвердить что ты не робот

Сохранение объекта поверх клавиатуры в случае старта FirstResponder или resignFirstResponder?

В настоящее время у меня есть UITextField поверх клавиатуры. Когда вы нажимаете на нее, она должна прилипать к клавиатуре и двигаться плавно. Я не знаю точную продолжительность и тип анимации клавиатуры, так что это действительно неуклюжий. Вот что у меня есть:

[theTextView resignFirstResponder];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.25];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
// Frame changes go here (move down 216px)
[UIView commitAnimations];

[theTextView becomeFirstResponder];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.25];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
// Frame changes go here (move up 216px)
[UIView commitAnimations];

Если кто-то сделал что-то подобное раньше, я хотел бы узнать настройки, которые вы использовали, чтобы сделать анимацию гладкой и заставить ее казаться, что панель "застряла" в верхней части клавиатуры.

4b9b3361

Ответ 1

UIKit posts UIKeyboardWillShowNotification, когда он показывает клавиатуру, и UIKeyboardWillHideNotification, когда он скрывает клавиатуру. Эти уведомления содержат все необходимое для правильной анимации вашего UITextField.

Скажем, ваш UITextField находится в свойстве с именем myTextField.

Во-первых, вам нужно зарегистрироваться для получения уведомлений. Где вы регистрируетесь, зависит от того, какой объект несет ответственность за перемещение myTextField. В моем проекте отвечает надзор за полем, и, поскольку я загружаю свой пользовательский интерфейс из набора, я делаю это в супервиде awakeFromNib:

- (void)awakeFromNib
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillShowNotification object:nil];
}

Если вы используете UIViewController для перемещения поля вокруг, вы, вероятно, захотите сделать это в viewWillAppear:animated:.

Вы должны отменить регистрацию в dealloc или viewWillDisappear:animated::

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Конечно, сложный бит находится в методе keyboardWillHideOrShow:. Сначала я извлекаю параметры анимации из уведомления:

- (void)keyboardWillHideOrShow:(NSNotification *)note
{
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];

    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

keyboardFrame находится в глобальной системе координат. Мне нужно преобразовать фрейм в ту же систему координат, что и myTextField.frame, а myTextField.frame находится в системе координат myTextField.superview:

    CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil];

Затем я вычисляю рамку, в которую хочу myTextField перейти. Нижний край нового кадра должен быть равен верхнему краю рамки клавиатуры:

    CGRect newTextFieldFrame = self.myTextField.frame;
    newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;

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

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        self.myTextField.frame = newTextFieldFrame;
    } completion:nil];
}

Здесь все собрано:

- (void)keyboardWillHideOrShow:(NSNotification *)note
{
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];

    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil];

    CGRect newTextFieldFrame = self.myTextField.frame;
    newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height;

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        self.myTextField.frame = newTextFieldFrame;
    } completion:nil];
}

Ответ 2

Задайте свое текстовое поле (или представление, содержащее текстовое поле) как inputAccessoryView поля, которое вы редактируете. Затем он автоматически присоединяется к верхней части клавиатуры и соответствующим образом подгоняется.

Ответ 3

чтобы UITextField состыковал клавиатуру (с анимацией), вам нужно выполнить вычисления смещения и применить изменения смещения в представлении прокрутки (при условии, что UITextField помещается в UIScrollView) с использованием метода setContentOffset:animation:.