Изменить contentInset UITableView без изменения его contentOffset?

Я хочу создать пользовательский интерфейс, подобный приложению сообщений Apple на iPhone. У меня есть представление таблицы и текстовое поле под ним. Когда я выбираю текстовое поле, я анимирую contentInset представления таблицы, когда клавиатура скользит вверх, так что содержимое отображается над клавиатурой.

У меня есть код, который использует распознаватель жестов панорамирования для обнаружения, когда пользователь прокручивает представление таблицы и анимирует клавиатуру вниз, как это происходит (если вы видите приложение сообщений Apple, оно имеет то же самое функциональность для отключения клавиатуры. Вы прокручиваете вниз на виде таблицы, и когда ваш палец скользит мимо текстового поля, клавиатура опускается вместе с ним).

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

кто-нибудь знает, как изменить contentInset представления прокрутки без изменения его contentOffset?

1 ответов


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

// in a method that gets repeatedly called as the pan gesture recognizer changes
if([tableView contentOffset].y > 0) {
    UIEdgeInsets insets = [tableView contentInsets];
    inset.bottom = currentKeyboardHeight;
    [tableView setContentInset:inset];
}

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


Edit: выяснил основную причину и подумал, что обновите это, а не просто оставьте обходной путь. Что я делала смешивания CGAffineTransformMakeTranslation в середине моих вычислений кадров, что является большим нет-нет в соответствии с документацией Apple. Когда transform собственность-это не CGAffineTransformIdentity на frame становится неопределенным, и это вызвало очень странное поведение, если я прокрутил представление таблицы и одновременно изменил его содержимое.