2014-12-17 4 views
1

Обновление:Как переместить UIScrollView при появлении клавиатуры?

мой вопрос: как предотвратить сброс прокрутки в позицию при нажатии на другое текстовое поле?

На самом деле я пробовал несколько способов, например, решение этой проблемы question.

Первоначально мой scrollView (несколько текстовых полей и текстовое представление в нем и все позиции размещены в раскадровке) находится в позиции (0, 302). Когда появится клавиатура, я хочу переместить ее до (0, 100). Во-первых, я попытался добавить кнопку и сделать следующее, это работает.

CGRect frame = self.informationScrollView.frame; 
frame.origin.y = 100; 
self.informationScrollView.frame = frame; 

Затем я попытался сделать то же код в селекторе UIKeyboardDidShowNotification, но это не удалось. Я обнаружил, что позиция всегда сбрасывается, даже когда изменяется текстовое поле действия. Может ли кто-нибудь сказать мне, как предотвратить перенаправление приложения? Большое спасибо.

+0

Почему вы не пытаетесь выполнить смещение содержимого scrollview –

+0

Вручную ....... – Andy

ответ

3
CGRect frame = self.informationScrollView.frame; 

[UIView animateWithDuration:1 
         delay:0 
        options: UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 

       self.informationScrollView setFrame:CGRectMake (frame.origin.x, 
                   frame.origin.y, 
                   frame.size.width, 
               <change height as per requirement>); 
       } 
       completion:nil]; 

для нескольких TextFields:

How to make a UITextField move up when keyboard is present?

Надеется, что это помогает.

+0

Нет, я хочу изменить frame.origin.y – Cuero

+0

Обновить значения фрейма согласно вашим требованиям, это был всего лишь пример кода. В вашем случае укажите значение Y как (frame.origin.y - ) – Mrunal

+0

Да, он работает при запуске. Но когда я нажимаю на другой textField, scrollView возвращается к исходной позиции (как установлено в раскадровке), как я могу ее предотвратить? – Cuero

1

Его довольно просто использовать это в вашем viewDidLoad метод

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

и написать код для Scrollview против высоты клавиатуры внутри этой

-(void)keyboardWasShown:(NSNotification*)notification 
{ 
NSDictionary *info = [notification userInfo]; 
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.view.frame.origin.x,self.view.frame.origin.y, kbSize.height+100, 0); 
self.scrollViewChildDetail.contentInset = contentInsets; 
self.scrollViewChildDetail.scrollIndicatorInsets = contentInsets; 
} 

-(void)keyboardWillBeHidden:(NSNotification *)notification 
{ 
UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
self.scrollViewChildDetail.contentInset = contentInsets; 
self.scrollViewChildDetail.scrollIndicatorInsets = contentInsets; 
} 

он работает.

+0

Спасибо, но, похоже, только перемещение содержимого scrollview вверх, но не прокрутка. – Cuero

+0

Да, это то, что вы хотите. его плохое программирование для перемещения scrollview, пока отображается клавиатура. мы устанавливаем здесь содержание scrollview не полного scrollView. –

+0

Но я также хочу перемещаться по экрану scrollView, поскольку контент сначала отображается внизу телефона, а когда появляется клавиатура, клавиатура скроет все прокрутки. Таким образом, мне нужно перемещать весь scrollView – Cuero

3

Если ypu использует UIScrollView, тогда вы должны взглянуть на TPAvoidingScrollView. Его легко использовать и дать ожидаемый результат. Вам просто нужно установить TPAvoidingScrollView в качестве суперкласса UIScrollView, и все будет заботиться TPScrollView. ПРОСТО ПОПРОБУЙТЕ. НАДЕЮСЬ ЭТО ПОМОЖЕТ.

+0

Moar upvotes для этого, пожалуйста. Тривиально легкая вставка, очень разрешительная лицензия - нет причин не делать этого таким образом. – user435779

0

Вот официальный Apple, Approved подход: Managing The Keyboard: Text Programming Guide

Однако я бы рекомендовал, если вы используете Autolayout, что вы используете ограничение для управления пространством между UITextView и нижней частью экрана и Programatically изменить его постоянная значение, соответствующее значению высоты клавиатуры с помощью уведомлений на клавиатуре, упомянутых в приведенной выше статье и других решениях здесь. Это связано с тем, что вы можете получать несколько уведомлений на клавиатуре с разной высотой, которые могут сломаться, если вы попытаетесь переключить рамку представления.

1

Используйте лучшую концепцию NSNotificationCenter, которая объяснена @Sarat_Patel

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

И справиться с местными методами:

-(void)keyboardWasShown:(NSNotification*)notification 
-(void)keyboardWillBeHidden:(NSNotification *)notification 
+0

То же самое. Нет необходимости давать ответ снова и снова дорогой ** @ DSP ** –

1

Лучший курс действий с UIScrollView это установить contentInsets и scrollIndicatorInsets на основе внешнего вида клавиатуры.Если содержимое представления прокрутки является экземпляром UITextField и UITextView, то вы должны компенсировать содержимое прокрутки с помощью contentOffset, не перемещая кадр прокрутки.

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

+0

Спасибо. Может быть, я должен прочитать больше примеров, так как я новичок в разработке iOS и не очень хорошо знаком с contentInsets, scrollIndicatorInsets и contentOffset. То, что я могу сделать, это копировать код из примеров из «Управление клавиатурой: руководство по программированию по текстам», но не знаю, почему это код. – Cuero

Смежные вопросы