Ответ 1
Если у вас по-прежнему возникают проблемы, вы можете попробовать установить символическую точку останова на - [UITableView setFrame:] и трассировать, откуда приходит вызов заданного фрейма. НТН
У меня есть стандартная настройка UITableView + UISearchDisplayController + UITableViewIndex. Все работает как чемпион.
Кроме того, при очень специфических условиях индекс растет слишком долго, чтобы отображать на экране. В частности, после завершения поиска и повторной отображения нефильтрованной индексированной таблицы индекс иногда растет слишком долго.
В частности, это не происходит, если я выполняю поиск и отменю. Это происходит только в том случае, если я выполняю поиск, затем нажимаю контроллер просмотра из таблицы поиска, затем возвращаю этот контроллер представления в таблицу поиска, затем отменяю поиск, затем пересматривает, а затем отменяю окончательный поиск. После окончания окончательного поиска индекс слишком длинный.
В портрете вид таблицы сообщает высоту 416, а индекс - 404 при нормальных условиях. Если я регистрируюсь из searchDisplayControllerDidEndSearch
, когда индекс имеет неправильный размер, он сообщает о высоте 620.
Я пробовал все: от setLayout
в таблице и индекс, чтобы вручную изменить размер фрейма. Ничего не работает (ручная настройка размера приводит к тому, что правильная высота регистрируется, но она не меняет отображение на экране).
Я собирался повторить калибровку после задержки в случае вмешательства анимации отмены, но затем я понял, в какой абсурдной ситуации я вхожу, и думал, что поиск помощи может быть мудрым...
Если у вас по-прежнему возникают проблемы, вы можете попробовать установить символическую точку останова на - [UITableView setFrame:] и трассировать, откуда приходит вызов заданного фрейма. НТН
Мой сценарий немного отличался от того, который был опубликован, но я нашел решение, которое работает в моем случае, так что, надеюсь, в том же, что и здесь.
У меня есть UITableView, который использует fetchedResultsController и загружает больше элементов с сервера, когда вы достигаете конца tableView. При поиске фильтр fetchedResultsController отфильтровывается и загружает больше записей с сервера, если их недостаточно для отображения.
Когда соединение возвращает результаты (после нажатия "поиск" ), я перезагружаю tableViews (исходный и searchResultsTableView). Теперь, когда вы отменяете поиск, и все возвращается к нормальному состоянию, я испытываю проблему с вопросом. UITableViewIndex растет до неожиданных границ.
Так как я также ощущаю, что UITableView изменен, чтобы быть намного большим, чем ожидалось, я сыграл догадку, и это сработало для меня. В подклассе UITableView (это ARC/6.1):
- (void)loadView
{
[super loadView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification
{
if ( self.isSearching )
{
// Ensure the correct height of the original tableview while displaying the searchresults-tableview
// only this will make sure, the height of the UITableViewIndex is set correctly ...
[UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){
CGRect rect = self.tableView.frame;
rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height;
self.tableView.frame = rect;
}];
}
}
- (void)keyboardWillHide:(NSNotification *)notification
{
if ( self.isSearching )
{
// Ensure the correct height of the original tableview while displaying the searchresults-tableview
// only this will make sure, the height of the UITableViewIndex is set correctly ...
[UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){
CGRect rect = self.tableView.frame;
rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height;
self.tableView.frame = rect;
}];
}
}
Вам может потребоваться настроить это.