Подтвердить что ты не робот

IPhone SDK: настройка размера таблицы таблиц UISearchDisplayController

Мое представление таблицы приложения не занимает всю высоту экрана, так как я допустил 50px внизу для баннера.

Когда я начинаю печатать в строке поиска, представление таблицы результатов поиска становится больше; он заполняет все доступное пространство экрана между панелью поиска и панелью вкладок. Это означает, что самый последний результат поиска скрывается за баннером.

Как мне указать размер табличного представления, используемого UISearchDisplayController? Там нет границ или свойства кадра, которые я могу видеть.

РЕДАКТИРОВАТЬ ДОБАВИТЬ СКРИНШОТЫ:

Так настраивается табличное представление в IB. Он заканчивается на 50px меньше синтезированной панели вкладок.

alt text
(источник: lightwood.net)

Вот как контент отображается нормально. Я прокрутил до самого дна здесь. alt text
(источник: lightwood.net)

Вот как это отображается при поиске. Я снова прокрутил до самого дна. Если я отключу рекламный баннер, то увижу, что таблица отображения поиска распространяется вниз до панели вкладок.

alt text
(источник: lightwood.net)

4b9b3361

Ответ 1

Ключом к решению этого вопроса было выяснить, когда нужно изменить геометрию табличного представления. Призвание:

[self.searchDisplayController.searchResultsTableView setFrame:someframe];

после создания UISearchDisplayController было бесполезно. Ответ был этот метод делегата:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.frame = someframe;
}

Заметьте, я тоже пробовал -searchDisplayController:didLoadSearchResultsTableView, но там ничего хорошего не было. Вам нужно подождать, пока оно не изменится.

Также обратите внимание, что если вы просто назначаете tableView.frame = otherTableView.frame, таблица результатов поиска перекрывает соответствующую строку поиска, поэтому невозможно удалить или отменить поиск!

Мой последний код выглядел так:

-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {

    CGRect f = self.masterTableView.frame;  // The tableView the search replaces
    CGRect s = self.searchDisplayController.searchBar.frame;
    CGRect newFrame = CGRectMake(f.origin.x,
                                 f.origin.y + s.size.height,
                                 f.size.width,
                                 f.size.height - s.size.height);

    tableView.frame = newFrame;
}

Ответ 2

Я обновил код, чтобы обеспечить более глубокие иерархии представлений, но исходный кадр полупрозрачного вида покрытия по-прежнему занимает все окно под панелью поиска.

-(void)searchDisplayController: (UISearchDisplayController*)controller 
 didShowSearchResultsTableView: (UITableView*)tableView 
{
    if ( [controller.searchBar.superview isKindOfClass: [UITableView class]] )
    {
        UITableView* staticTableView = (UITableView*)controller.searchBar.superview;

        CGRect f = [tableView.superview convertRect: staticTableView.frame fromView: staticTableView.superview];
        CGRect s = controller.searchBar.frame;
        CGRect newFrame = CGRectMake(f.origin.x,
                                     f.origin.y + s.size.height,
                                     f.size.width,
                                     f.size.height - s.size.height);

        tableView.frame = newFrame;
    }
}

Ответ 3

Я не уверен, что полностью понимаю, что вы описываете, было бы неплохо иметь скриншот.

Похоже, что UITableView - это размер экрана, а баннер перекрывает нижние 50 пикселей. Все дети UIView имеют свойства рамки, границ и центра, которые они наследуют от своего общего родителя UIView.

@interface UIView(UIViewGeometry)

// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect            frame;

// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part
@property(nonatomic) CGRect            bounds;      // default bounds is zero origin, frame size. animatable
@property(nonatomic) CGPoint           center;      // center is center of frame. animatable
@property(nonatomic) CGAffineTransform transform;   // default is CGAffineTransformIdentity. animatable
// ... from UIView.h

Вы можете манипулировать этими свойствами по своему усмотрению, похоже, вам просто нужно настроить границы на 50 пикселей меньше, чем на экране, и сделать некоторые математические вычисления для расчета вашего нового центра.