Почему UISearchBar и его кнопки видимости отображаются в одной строке? - PullRequest
7 голосов
/ 10 августа 2010

Я видел пример Apple "TableSearch", который при прикосновении к его кнопкам области видимости появляется ниже панели поиска http://developer.apple.com/iphone/library/samplecode/TableSearch/Introduction/Intro.html

Но когда я делаю свой собственный, он сначала выглядит хорошо, но когда я касаюсь, это выглядит некрасиво, кнопки области и панель поиска отображаются в одной строке, как эта: http://cl.ly/BN9

Что мне нужно сделать, чтобы он был похож на пример "TableSearch" в iPad?

Я делаю все в IB и попытался программно изменить строку поиска с контроллера:

    - (void)viewDidLoad {

        [super viewDidLoad];
        self.tableView.rowHeight = 88.0f;
        self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
self.searchDisplayController.searchResultsTableView.rowHeight = self.tableView.rowHeight;


    //BELOW DID NOT WORK:
    CGRect b = self.searchDisplayController.searchBar.bounds;
    self.searchDisplayController.searchBar.bounds = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight);
    b = self.searchDisplayController.searchBar.frame;
    self.searchDisplayController.searchBar.frame = CGRectMake(b.origin.x, b.origin.y, b.size.width, self.tableView.rowHeight);

    //BELOW WORKS PERFECT BUT IS A PRIVATE METHOD, HENCE I AM NOT SUPPOSED TO USE IT
    //[self.searchDisplayController.searchBar setCombinesLandscapeBars:NO];

     }

Заранее спасибо.

Ответы [ 4 ]

10 голосов
/ 24 августа 2010

Я также столкнулся с этой ошибкой, и я подал отчет в Apple и запросил техническую помощь. Я дам вам знать, как это происходит. А пока я кратко расскажу вам об этой ошибке.

На iPhone, чтобы сохранить драгоценную недвижимость с вертикальным экраном в ландшафтном режиме, UISearchDisplayController устанавливает UISearchBar для объединения своей панели поиска и поля поиска в одном горизонтальном макете. Это работает довольно хорошо из-за увеличенного горизонтального размера экрана (480 точек в альбомной ориентации). К сожалению, он работает не очень хорошо на iPad, где в ландшафтном режиме изменение пользовательского интерфейса действительно не нужно, во-первых, потому что у вас есть много вертикальной недвижимости. В главном представлении UISplitViewController у вас также есть только 320 пикселей горизонтального пространства отображения, а не увеличенный 480 iPhone. Результат - iSore.

Предположительно, проблема в том, что UISearchDisplayController ведет себя плохо в своем willRotateToInterfaceOrientation: duration: метод. В частности, не стоит проверять, находится ли он на iPhone или нет, прежде чем он устанавливает свойство combinesLandscapeBars на свой UISearchBar. Частный API-ключ в вашем коде работает, потому что он исправляет этот упущение в UISearchDisplayController. Но, конечно, Apple обрушит ярость древних на вас за использование недокументированных API, так что вы не сможете. На самом деле мы находимся во власти Apple.

Если вы готовы отказаться от удовольствия и удобства UISearchDisplayController, вы можете использовать UISearchBar без UISearchDisplayController и самостоятельно управлять аспектами представления. Очевидно, что для этого требуется гораздо больше кода, и было бы бессмысленно, если бы инженеры Apple API выполнили свою работу, но это, по крайней мере, устранит ошибку отображения.

Если вы Apple, вы можете использовать собственные недокументированные API, поэтому в Mail.app такой проблемы нет.

UPDATE

Отчет об ошибке, который я подал в Apple, # 8344719.

1 голос
/ 14 ноября 2011

Используя следующий код, вы не получите предупреждение:

if ([self.searchDisplayController.searchBar respondsToSelector:@selector(setCombinesLandscapeBars:)])
{
    objc_msgSend(self.searchDisplayController.searchBar, @selector(setCombinesLandscapeBars:), NO );
}
0 голосов
/ 14 декабря 2010

Я получаю эту проблему на iPad, но могу заставить ее работать, если вставлю это в файл своей реализации:

@synthesize tableView;

Я предполагаю, что с XIB что-то плохоезагружен, но я не знаю, почему это все исправит.

0 голосов
/ 24 августа 2010

Когда вы устанавливаете границы и фрейм для панели поиска, как для фрейма здесь:

blabla.searchBar.frame = CGRectMake(b.origin.x, 
                                    b.origin.y, 
                                    b.size.width, 
                                    self.tableView.rowHeight);

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

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

...