Я только начал учиться программировать приложения для iPhone и, похоже, не могу понять, как заставить представление скользить в сторону, когда появляется клавиатура (чтобы вы все еще могли видеть текстовое поле, которое вы вводите). Как это делается?
Сделать вид слайдом вверх, чтобы освободить место для клавиатуры?
Ответы (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];
}
Один из способов сделать это — поместить все в UIScrollView, а затем прокрутить содержимое вверх. Другой способ — переместить представление самостоятельно, обычно с помощью Core Animation, чтобы оно выглядело красиво.
Лучше всего начать с документации. Есть даже раздел с полезной пометкой Перемещение содержимого, расположенного под клавиатурой, которое укажет вам правильное направление.
предположим, вам нужно переместить представление в текстовом поле, тег которого равен 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.
Надеюсь, это поможет вам.
Я обнаружил, что использование уведомлений с клавиатуры работает лучше для моего приложения, чем использование протокола делегата UITextField textFieldDidBeginEditing и textFieldDidEndEditing. Уведомления — это клавиатураWillShow и клавиатураWillHide. Можно протестировать UITextField или UITextView, которые потребуют, чтобы представление перемещалось с этими уведомлениями, а затем условно перемещало представление. Преимущество моего приложения в том, что у меня много UITextTields, а уведомления упрощают сохранение вида над клавиатурой при переходе редактирования от одного поля к другому.