UISearchDisplayController изменение высоты строки
Я установил высоту строки UITableView
в Interface Builder до 54.0. У меня есть UISearchDisplayController
. Когда пользователь вставляет в него строку поиска, таблица правильно изменяется. Однако, когда они начинают печатать (и фактически выполняют поиск), высота строки уменьшается. Он остается недействительным, пока поиск не ударит Отмена.
Я не могу найти документацию об этом поведении на сайте Apple.
Я попытался установить высоту строки в UISearchDisplayDelegate
делегированных вызовах. Это может быть правильный подход, но я не знаю деталей и не могу заставить его работать.
Я также попытался реализовать - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
. Это сработало, но у меня есть тысячи записей в этом списке и не может принять удар по производительности.
Какой правильный способ исправить это?
Ответы
Ответ 1
Правильный способ сделать это - использовать следующий делегат.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
tableView.rowHeight = 54.0f; // or some other height
}
Он вызывается, когда создается или отображается UITableView
.
Если вы случайно вызываете searchDisplayController.searchResultsTableView
в другом коде, когда поиск не выполняется, он заранее создаст UITableView. Если вы используете метод делегата willShow
для установки rowHeight
, он пропустит время (по какой-то причине), чтобы изменить rowHeight, если tableView был создан заранее.
Ответ 2
Я нашел его!
Предполагая, что таблица хранится в tableView
:
- (void)viewDidLoad;
{
[super viewDidLoad];
self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight;
}
Больше ничего не нужно.
Изменить: см. ответ netmikey для лучшего решения.
Ответ 3
Стив, ваше решение не сработало для меня: первый раз результат поиска будет отображаться хорошо, но когда пользователь нажимал "Отмена" (закрывая панель поиска), а затем снова открывал его и вводил поисковый запрос в он, высота будет неправильной снова.
Решение DigDog с использованием searchDisplayController:didShowSearchResultsTableView
было отработанным, но пользователи увидели, что высота ячейки "прыгает" при запуске поиска.
Решение, которое я нашел, устраняет обе эти проблемы:
- (void)searchDisplayController: (UISearchDisplayController *)controller
willShowSearchResultsTableView: (UITableView *)searchTableView {
searchTableView.rowHeight = myTableView.rowHeight;
}
... в UISearchDisplayDelegate
.
С уважением,
netmikey
Ответ 4
В 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;
}
}
Ответ 5
Переопределение метода didLoadSearchResultsTableView должно сделать трюк.
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 82.0; // Change height of search result row
}
Больше объяснений от этого блога
Ответ 6
Вам нужно установить оба
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 54.;
}
и
self.tableView.rowHeight = 54.;
также в вашем UISearchDisplayDelegate
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
tableView.rowHeight = 54.;
}
В противном случае, когда "Нет результата" произошло при поиске, высота ячейки вернется к умолчанию.
Ответ 7
Я использую 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 ...;
}
}
Поскольку каждый раз, когда табличное представление пытается отобразить его макет, этот метод вызывается, поэтому каждый раз, когда вы вводите письмо в строку поиска, этот метод вызывается, а высота строки не будет иметь шансов на изменение.
Ответ 8
Ни один из решений не работал у меня...
Сделал мой собственный хит и пробный... и получил его работу...
Если вам нужны разные высоты строк для обычных и поисковых таблиц...
-(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: Имейте в виду, если у вас одинаковая высота строки для каждой строки, этот метод не очень эффективен для использования ресурсов, поскольку высота строки пересчитывается для каждой ячейки... Хотя это незаметно в В большинстве случаев я все еще ищу лучшее решение!