Представление таблицы не адаптируется к клавиатуре должным образом

У меня есть пользовательский унаследованный класс UIView с UITableView внутри него в качестве единственного подвида. Я пытаюсь имитировать обычную функциональность UITableViewController, когда отображается клавиатура, чтобы настроить contentInset и scrollIndicatorInsets табличного представления на высоту клавиатуры. Это мой метод, который вызывается, когда клавиатура отображается из моего пользовательского класса UIView:

- (void)keyboardDidShow:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    _tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    _tableView.scrollIndicatorInsets = _tableView.contentInset;
}

Это работает в определенной степени, но по какой-то причине клавиатура все еще перекрывается с представлением таблицы, может быть, на десять или около того пикселей.

Перекрытие клавиатуры

Я думаю, что это как-то связано с тем, что не учитывается другая геометрия экрана, но я не понимаю, как это может быть. Высота клавиатуры должна быть именно такой, какая мне нужна, потому что tableView растягивается до самого низа экрана. Любые идеи?


person Anna    schedule 16.12.2012    source источник


Ответы (2)


Измените tableView.frame.size.height для учета клавиатуры.

когда отображается клавиатура, уменьшите высоту, когда не отображается, увеличьте высоту.

обратитесь к этому, если вы хотите рассмотреть высоту клавиатуры для всех возможностей http://www.idev101.com/code/User_Interface/sizes.html

Не связывайтесь с contentInset и scrollIndicatorInsets. Просто установка frameSize позаботится об этом за вас.

вот каким должен быть ваш метод

- (void)keyboardDidShow:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    CGRect rect = _tableView.frame;
    rect.size.height = _tableView.frame.size.height - kbSize.height;
    _tableView.frame = rect;
}

- (void)keyboardWillHide:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    CGRect rect = _tableView.frame;
    rect.size.height = _tableView.frame.size.height + kbSize.height;
    _tableView.frame = rect;
}

Я использовал этот фрагмент кода для аналогичной функциональности. Так что, если он все еще не работает, что-то еще идет не так.

person Nitin Alabur    schedule 16.12.2012
comment
Я использовал пример из документации Apple по Управлению клавиатурой. Взгляните на раздел Перемещение содержимого, расположенного под клавиатурой. Там вы видите, что Apple рекомендует использовать вставки. Тем не менее, я дал вашему решению шанс, черт возьми. Та же проблема, но теперь я ясно вижу, что высоты, возвращаемой клавиатурой, недостаточно. Ниже приведена композиция, показывающая, как выглядит мой кадр, когда я вычитаю его из высоты, возвращаемой клавиатурой. Забавно, что возвращенная высота равна 216, что, по словам Apple, должно быть. Я немного потерян. - person Anna; 17.12.2012
comment
comment
Анна упоминает высоту клавиатуры 216, что я вижу и в портретном режиме. Мне интересно, была ли ее композиция сделана с использованием пикселей на картинке и без учета того, что эти значения указаны в точках (не в пикселях). - person DataJock; 18.06.2013
comment
попробуйте раскрыть app.com. загрузите бета-версию, и вы сможете увидеть, что на самом деле происходит с вашим приложением на симуляторе. - person Nitin Alabur; 18.06.2013
comment
Работает ли это, когда представление таблицы зависит от ограничений макета? - person marco alves; 02.10.2013

Мне любопытно, почему это не работает для вас, поскольку у меня есть в основном то же самое, и это работает для меня. Есть только одно отличие, которое я вижу, в том, что я не обращаюсь к '_tableView', а вместо этого всегда использую геттер и сеттер.

Вот что я делаю, это работает.

- (void)keyboardDidShow:(NSNotification *)keyboardNotification
{
    NSDictionary *info = [keyboardNotification userInfo];
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    CGFloat newBottomInset = 0.0;

    UIEdgeInsets contentInsets;
    if (UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]) ) {
        newBottomInset = keyboardSize.height;
    } else {
        newBottomInset = keyboardSize.width;
    }

    contentInsets = UIEdgeInsetsMake(0.0, 0.0, newBottomInset, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}

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

Надеюсь, доступ self.tableView будет иметь значение.

person DataJock    schedule 18.06.2013