2009-08-21 6 views
2

Я знаю, что вы можете использовать свойство «Вставить» в Interface Builder, чтобы сделать вид прокрутки вставкой из главного окна, чтобы оно не опускалось ниже существующего элементы управления на экране, такие как панель вкладок, но как вы можете сделать это программно, чтобы настроить, когда клавиатура добавляется на экран? В настоящее время в моем представлении прокрутки есть ячейки под клавиатурой, которые не могут быть достигнуты, потому что представление все еще регистрирует нижнюю часть прокрутки в нижней части телефона, а не на верхней части клавиатуры. Любая помощь?Изменение вложений прокрутки UITableView программно, чтобы отразить размер клавиатуры iPhone.

ответ

7
#pragma mark Keyboard Handling 



- (void) viewDidAppear:(BOOL) ani { 
    onscreen = YES; 

    NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 
    [center addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil]; 
    [center addObserver:self selector:@selector(keyboardDidAppear:) name:UIKeyboardDidShowNotification object:nil]; 
    [center addObserver:self selector:@selector(keyboardWillDisappear:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void) viewDidDisappear:(BOOL) ani { 
    onscreen = NO; 

    NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 
    [center removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [center removeObserver:self name:UIKeyboardDidShowNotification object:nil]; 
    [center removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void) keyboardWillAppear:(NSNotification*) n { 
    NSLog(@"Keyboard is about to appear"); 
} 

- (void) keyboardDidAppear:(NSNotification*) n { 

    CGRect bounds = [[[n userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; 
    bounds = [self.view convertRect:bounds fromView:nil]; 

    CGRect tableFrame = searchResultsTable.frame; 
    tableFrame.size.height -= bounds.size.height; // subtract the keyboard height 
    if (self.tabBarController != nil) { 
     tableFrame.size.height += 48; // add the tab bar height 
    } 

    [UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkDidEnd:finished:contextInfo:)]; 
    searchResultsTable.frame = tableFrame; 
    [UIView commitAnimations]; 

    //[self hideEditorView:currentEditorView]; 
    //[currentEditorView removeFromSuperview]; 
} 

- (void) shrinkDidEnd:(NSString*) ident finished:(BOOL) finished contextInfo:(void*) nothing { 
    NSIndexPath* sel = [searchResultsTable indexPathForSelectedRow]; 

    if (![[searchResultsTable indexPathsForVisibleRows] containsObject:sel]) 
    { 
     [searchResultsTable scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
    } 
} 

- (void) keyboardWillDisappear:(NSNotification*) n { 
    CGRect bounds = [[[n userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; 
    bounds = [self.view convertRect:bounds fromView:nil]; 

    CGRect tableFrame = searchResultsTable.frame; 
    tableFrame.size.height += bounds.size.height; // add the keyboard height 

    if (self.tabBarController != nil) { 
     tableFrame.size.height -= 48; // subtract the tab bar height 
    } 

    [UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkDidEnd:finished:contextInfo:)]; 
    searchResultsTable.frame = tableFrame;  
    [UIView commitAnimations]; 

    [searchResultsTable scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 
+0

это альтернатива, и мне это нравится, потому что таким образом представление таблицы не обязательно должно быть делегатом текстовые поля ...+1 – Daniel

+1

Вы не должны использовать подчеркивание в качестве префикса для своих методов, потому что они могут столкнуться с собственными методами Apple. Вместо этого вы должны использовать что-то вроде _slf. –

+0

@Rafael вот и вы, удалили подчеркивания :) – slf

1

Два варианта. (Когда вы говорите прокрутки мнение, я думаю, вы имеете в виду вид таблицы, так как предполагает название так)

  1. Используйте UITableViewController, если клавиатура добавляется в табличном я считаю, что это будет делать изменения размера для вас

  2. в протоколе текстового поля или текстового поля в методе - (void)textFieldDidBeginEditing:(UITextField *)textField, изменить размер просмотра кадра таблицы и конец сделал установить его редактирование отделки назад так (это один вы можете сделать, если его вид прокрутки, а не Tableview)

    • (void) textFie ldDidBeginEditing: (UITextField *) textField { CGRect frame = tableView.frame; // или просмотр прокрутки frame.size.height = frame.size.height- keyboardHeight; tableView.frame = кадр }

    • (пустоты) textFieldDidEndEditing: (UITextField *) TextField { CGRect рамы = tableView.frame; // или просмотр прокрутки frame.size.height = frame.size.height + keyboardHeight; tableView.frame = кадр }

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

+0

«Использование UITableViewController» был самым полезным намек на все вопросы, касающиеся этой темы. – hop

+0

не очень. я думаю, что событие для клавиатуры, как указано ниже, или являющееся делегатом текстового поля, прекрасно и просто реализовать ... – Daniel

0

Другого простым способу с помощью Interface Builder или код

Установите [Table View Размер Footer Высота] до 200 (поиграйте с этим для своего макета). Это фактически делает таблицу больше, чем ограничивающий фрейм, внутри которого он содержится, позволяя прокручивать таблицу выше, чем обычно.

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

+0

Я думаю, что вы должны использовать вставки Content/Scroller для такого рода вещей – kolinko

0

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

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

http://git.io/BrH9eQ

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