Сделать вид слайдом вверх, чтобы освободить место для клавиатуры?

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


person Ry-♦    schedule 05.05.2011    source источник
comment
Майкл Тайсон написал компонент, который автоматизирует это: Универсальное решение для перемещения текстовых полей с клавиатуры.   -  person    schedule 05.05.2011
comment
Эта ссылка работает ОЧЕНЬ хорошо! Спасибо!   -  person BlackHatSamurai    schedule 21.05.2013


Ответы (4)


Если визуально все в порядке, проще всего переместить весь self.view.frame, а затем переместить его обратно, когда закончите.

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3f;

- (void) animateForToNewYPosition:(int)newYPosition {
    // move for kdb
    if (self.view.frame.origin.y == newYPosition) {
        return;
    }

    // start animation
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];  

    // move it
    self.view.frame.origin.y = newYPosition;

    [UIView commitAnimations];  
}
person dredful    schedule 05.05.2011
comment
Спасибо, именно то, что мне было нужно! - person Ry-♦; 06.05.2011
comment
Как вы называете этот метод? - person kendotwill; 22.01.2015
comment
используя делегат UITextField, вы можете поместить вызов animateForToNewYPosition: в метод делегата textFieldDidBeginEditing: хороший пример/ответ здесь: stackoverflow.com /a/17887070/203960 - person dredful; 22.01.2015

Один из способов сделать это — поместить все в UIScrollView, а затем прокрутить содержимое вверх. Другой способ — переместить представление самостоятельно, обычно с помощью Core Animation, чтобы оно выглядело красиво.

Лучше всего начать с документации. Есть даже раздел с полезной пометкой Перемещение содержимого, расположенного под клавиатурой, которое укажет вам правильное направление.

person Caleb    schedule 05.05.2011
comment
Хорошо, как мне это сделать с UIScrollView? - person Ry-♦; 05.05.2011
comment
Добавлена ​​ссылка выше, которая говорит вам, что вам нужно знать. - person Caleb; 05.05.2011

предположим, вам нужно переместить представление в текстовом поле, тег которого равен 4 (когда у вас есть более 1 поля txt и одно из них покрыто клавиатурой), затем используйте метод делегата textField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField   
{
if(textField.tag==4)
    CGRect viewFrame;
    viewFrame=self.view.frame;
    if(viewFrame.origin.y==-100)
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:.3];
        viewFrame.origin.y+=100;
        self.view.frame=viewFrame;
        [UIView commitAnimations];
    }

}

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

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
   if(textField.tag==4)
{
 CGRect viewFrame;
    viewFrame=self.view.frame;
    if(viewFrame.origin.y==-100)
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:.3];
        viewFrame.origin.y+=100;
        self.view.frame=viewFrame;
        [UIView commitAnimations];
    }
}
}

В случае текстового просмотра вам нужна кнопка, а для перемещения вверх вам нужен этот делегат

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView

и используйте тот же код, что и textField

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

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

person Ishu    schedule 05.05.2011
comment
Я поместил это в файл ViewController, верно? Он должен вызываться автоматически? У меня это не работает... - person Ry-♦; 08.05.2011
comment
Вам нужно установить соединение для делегата textField с владельцем файла или сделать программно yourTxtField.delegate=self; затем эти методы делегата вызываются самим собой - person Ishu; 09.05.2011

Я обнаружил, что использование уведомлений с клавиатуры работает лучше для моего приложения, чем использование протокола делегата UITextField textFieldDidBeginEditing и textFieldDidEndEditing. Уведомления — это клавиатураWillShow и клавиатураWillHide. Можно протестировать UITextField или UITextView, которые потребуют, чтобы представление перемещалось с этими уведомлениями, а затем условно перемещало представление. Преимущество моего приложения в том, что у меня много UITextTields, а уведомления упрощают сохранение вида над клавиатурой при переходе редактирования от одного поля к другому.

person T.J.    schedule 19.10.2011