2014-02-08 5 views
1

У меня есть приложение с UITableView, которое имеет UITextFields внутри UITableViewCells, у которого пользователь будет либо виртуальным UIKeyboard, либо клавиатурой bluetooth, подключенной для ввода текста в UITextFields.Как изменить размер UITableView при видимости UIKeyboard

Если клавиатура Bluetooth подключена, я хочу, чтобы во время выбора и ввода текста была сохранена максимальная высота UITableView. Когда клавиатура Bluetooth не подключена, если ее видимый я хотел бы уменьшить UITableview, чтобы он соответствовал UIkeyboard, если он не отображается, я бы хотел снова сделать полный размер UITableView.

Я попытался сделать это, используя методы делегата UIKeyboard

- (void)keyboardDidShow:(NSNotification *)aNotification; 
- (void)keyboardDidHide:(NSNotification *)aNotification; 

по какой-то причине keyboardDidShow не доступ никогда, но keyboardDidHide осуществляется доступ, когда UIKeyboard удаляется из поля зрения, и я не могу понять, почему .. Любые идеи очень приветствуются.

+0

использование contentoffset – codercat

ответ

1
- (void)keyboardDidShow:(NSNotification *)aNotification; 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:0.3f]; 
    self.tblView.frame = CGRectMake(0, height, self.view.frame.size.width, self.view.frame.size.height - 255); // or -216 
    [UIView commitAnimations]; 
} 

- (void)keyboardDidHide:(NSNotification *)aNotification; 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:0.2f]; 
    self.tblView.frame = CGRectMake(0, height, self.view.frame.size.width, self.view.frame.size.height - height); 
    [UIView commitAnimations]; 
} 

И UITextField методы делегата

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    CGRect rc = [textField bounds]; 
    rc = [textField convertRect:rc toView:self.tblView]; 
    CGPoint pt = rc.origin; 
    pt.x = 0; 
    if(rc.origin.y > 200) 
     pt.y -= 150; 
    else 
     pt.y -= rc.origin.y; 
    [self.tblView setContentOffset:pt animated:YES]; 

    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

хорошо, так это работает в отношении к представлению прокрутки на въезд, однако метод keyboardDidShow еще дозы не привыкнет ... я не могу сказать, почему. Я поставил там точку останова, и она никогда не попадала. – HurkNburkS

+0

Критикам необходимо добавить наблюдателя ** [[NSNotificationCenter defaultCenter] addObserver: self селектор: @selector (keyboardDidShow :) имя: UIKeyboardDidShowNotification объект: nil]; ** – HurkNburkS

0

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

selectRowAtIndexPath: анимированный: scrollPosition:

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

- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition 

Особых соображения Передача UITableViewScrollPositionNone приведут к отсутствию прокрутки, а не минимальной прокрутке, описанной для этой константы. Чтобы прокрутить выбранную строку с минимальной прокруткой, выберите строку с помощью этого метода с помощью UITableViewScrollPositionNone, затем вызовите scrollToRowAtIndexPath: atScrollPosition: анимированный: с помощью UITableViewScrollPositionNone. более

NSIndexPath *rowToSelect; // assume this exists and is set properly 
UITableView *myTableView; // assume this exists 

[myTableView selectRowAtIndexPath:rowToSelect animated:YES scrollPosition:UITableViewScrollPositionNone]; 
[myTableView scrollToRowAtIndexPath:rowToSelect atScrollPosition:UITableViewScrollPositionNone animated:YES]; 

понять Setting scroll position in UITableView

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