IPhone SDK: настройка размера таблицы таблиц UISearchDisplayController
Мое представление таблицы приложения не занимает всю высоту экрана, так как я допустил 50px внизу для баннера.
Когда я начинаю печатать в строке поиска, представление таблицы результатов поиска становится больше; он заполняет все доступное пространство экрана между панелью поиска и панелью вкладок. Это означает, что самый последний результат поиска скрывается за баннером.
Как мне указать размер табличного представления, используемого UISearchDisplayController? Там нет границ или свойства кадра, которые я могу видеть.
РЕДАКТИРОВАТЬ ДОБАВИТЬ СКРИНШОТЫ:
Так настраивается табличное представление в IB. Он заканчивается на 50px меньше синтезированной панели вкладок.
(источник: lightwood.net)
Вот как контент отображается нормально. Я прокрутил до самого дна здесь.
(источник: lightwood.net)
Вот как это отображается при поиске. Я снова прокрутил до самого дна. Если я отключу рекламный баннер, то увижу, что таблица отображения поиска распространяется вниз до панели вкладок.
(источник: lightwood.net)
Ответы
Ответ 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 пикселей меньше, чем на экране, и сделать некоторые математические вычисления для расчета вашего нового центра.