iPhone SDK: установка размера табличного представления UISearchDisplayController - PullRequest
12 голосов
/ 05 марта 2010

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

51 голосов
/ 07 марта 2010

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

[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;
}
1 голос
/ 22 февраля 2011

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

-(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;
    }
}
0 голосов
/ 05 марта 2010

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

Звучит так, как будто UITableView - это размер экрана, а баннерперекрывая нижние 50 пикселей этого.У всех детей UIView есть свойства frame, bounds и center, которые они наследуют от своего общего родителя 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 пикселей меньше, чем экран, и сделайте небольшую математическую расчётку, чтобы вычислить новый центр.

...