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