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: Имейте в виду, если у вас одинаковая высота строки для каждой строки, этот метод не очень эффективен в использовании ресурсов, так как высота строки пересчитывается для каждой ячейки... Хотя в большинстве случаев это незаметно, Я все еще ищу лучшее решение!

Другие вопросы по тегам