UISearchDisplayController изменяет высоту строки
Я установил свой UITableView
высота строки в Интерфейсном Разработчике до 54.0. у меня есть UISearchDisplayController
на этот взгляд. Когда пользователь нажимает на строку поиска в ней, размер таблицы корректно изменяется. Однако, когда они начинают печатать (и фактически выполняют поиск), высота строки уменьшается. Это остается неправильным, пока поиск не коснется Отмена.
Я не смог найти никакой документации по этому поведению на сайте Apple.
Я попытался установить высоту строки в UISearchDisplayDelegate
делегатские звонки. Это может быть правильным подходом, но я не знаю деталей и не могу заставить его работать.
Я также пытался реализовать - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
, Это сработало, но у меня есть тысячи записей в этом списке, и я не могу принять удар по производительности.
Как правильно это исправить?
8 ответов
Правильный способ сделать это - использовать следующий делегат.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
tableView.rowHeight = 54.0f; // or some other height
}
Это называется, когда UITableView
создан или показан.
Если вам случится позвонить searchDisplayController.searchResultsTableView
в другом коде, когда поиск не выполняется, он заранее создаст UITableView. Если вы используете willShow
метод делегата для установки rowHeight
, он пропустит время (по какой-то причине), чтобы изменить rowHeight, если tableView был создан заранее.
Я нашел это!
Предполагая, что таблица хранится в tableView
:
- (void)viewDidLoad;
{
[super viewDidLoad];
self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight;
}
Больше ничего не нужно.
Изменить: см. Ответ netmikey для лучшего решения.
Стив, ваше решение не сработало для меня: в первый раз результаты поиска отображались нормально, но когда пользователь нажимал "Отмена" (закрывая панель поиска), а затем снова открывал его и вводил в него поисковый запрос, высота снова будет неправильной.
Решение DigDog об использовании searchDisplayController:didShowSearchResultsTableView
было довольно хорошо, но пользователи увидели, что высота ячейки "прыгает", когда начался поиск.
Я нашел решение, которое исправило обе эти проблемы:
- (void)searchDisplayController: (UISearchDisplayController *)controller
willShowSearchResultsTableView: (UITableView *)searchTableView {
searchTableView.rowHeight = myTableView.rowHeight;
}
... в UISearchDisplayDelegate
,
С уважением, netmikey
В viewDidLoad:
Вы можете установить делегата контроллера отображения поиска на себя:
- (void)viewDidLoad
{
self.searchDisplayController.delegate = self;
}
Затем реализуйте делегат табличного представления в вашем контроллере представления:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableview == self.searchDisplayController.tableView) {
return 55;
} else if (tableView == self.tableView) {
return 44;
}
}
Переопределение метода didLoadSearchResultsTableView должно помочь.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 82.0; // Change height of search result row
}
Больше объяснений из этого блога
Вам нужно установить оба
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 54.;
}
а также
self.tableView.rowHeight = 54.;
также в вашем UISearchDisplayDelegate
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 54.;
}
В противном случае, когда при поиске произойдет "Нет результата", высота ячейки вернется к значению по умолчанию.
Я использую IOS 7.0 и Xcode 5.0. Я думаю, что вы должны изменить высоту строки в этом методе:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
tableView.rowHeight = ...;// change your row height here!
return [self.searchResults count];
}
else
{
...
return ...;
}
}
Поскольку каждый раз, когда табличное представление пытается отобразить свой макет, вызывается этот метод, поэтому каждый раз, когда вы вводите букву в строку поиска, вызывается этот метод, и высота строки не будет иметь возможности измениться.
Ни одно из решений не сработало для меня...
Сделал мой собственный хит и пробную версию... и получил это работает...
Если вы хотите различную высоту строки для обычного и поискового просмотра таблицы...
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// for normal results
if (tableView==self.tableView) return 54;
// for search results
else return 54; }
И если вы хотите общий рост...
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 54; }
PS: Имейте в виду, если у вас одинаковая высота строки для каждой строки, этот метод не очень эффективен в использовании ресурсов, так как высота строки пересчитывается для каждой ячейки... Хотя в большинстве случаев это незаметно, Я все еще ищу лучшее решение!