2011-12-21 4 views
15

[Изменить] Проблема решена. У меня не было должным образом связаны мои делегаты в UIBuilder. Код хороший!Перемещение UIScrollView при вводе клавиатуры

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

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW1

Слева "Управление клавиатуры".

В документации в нем содержится немного кода для определения размера клавиатуры, а затем для изменения размера UIScrollView. Я поместил NSLog сообщений в коде функции - (void)keyboardWasShown:(NSNotification*)aNotification, так что я вижу, что эта функция фактически вызывается, но когда я пытаюсь, чтобы NSLog в kbSize .height она всегда оценивается в 0.

Почему код, яблоко для этой цели не работает?

- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 
+0

Спасибо много, что фрагмент коды содержит все, что нужно :) – matehat

+2

Вы можете использовать [KBKeyboardObserver] (https://github.com/kam800/KBKeyboardObserver) библиотеки для наблюдения события клавиатуры. – kam800

ответ

3

Вы когда-нибудь добавляли наблюдателя для этого конкретного уведомления? Убедитесь, что в вашем методе loadView вы это делаете:

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

Не забудьте отменить наблюдатель от viewDidUnload метода, как это:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

Позвольте мне знать, если это работает!

+0

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

+2

Вам нужно обновить этот пост. viewDidUnload больше не вызывается. –

33

Вы можете попробовать настоятельно рекомендуется «TPKeyboardAvoidingScrollView», доступный от: https://github.com/michaeltyson/TPKeyboardAvoiding

работает как шарм ...

+1

+1 Легко, черт возьми, реализовать и действительно хорошо. Я предлагаю объединить его с BSKeyboardControl, чтобы добавить управление навигацией в текстовые поля: http://www.cocoacontrols.com/controls/bskeyboardcontrols – Groot

+0

@ Reuven При использовании TPKeyboardAvoidingScrollview иногда, если мы копируем и вставляем текст, просмотр полностью восходит. есть ли какое-либо решение для этого? .. –

+1

Работает ли он с 'UIPresentationModeFormSheet'? – fatuhoku

0

Я сделал это несколько раз с UITableView (это просто расширено UIScrollView). Вы можете найти code in this answer.

0

Одно простое решение, чтобы добавить расширение UIViewController + Keyboard.swift к вашему проекту, с одной линией

setupKeyboardNotifcationListenerForScrollView(scrollView) 

он будет автоматически изменять размер автоматически, когда появляется клавиатура. Не нужно ничего подклассифицировать, просто расширение! Его экранное на GitHub SingleLineKeyboardResize

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