2010-08-10 1 views
7

Я видел пример Apple «TableSearch», который при касании его кнопок сферы попадает под панель поиска. http://developer.apple.com/iphone/library/samplecode/TableSearch/Introduction/Intro.htmlПочему UISearchBar и его кнопки масштаба отображаются в одной строке?

Но когда я делаю мой собственный, он выглядит хорошо на первый, но, когда я прикасаюсь это выглядит некрасиво, кнопки Scope и панель поиска отображаются в одной и той же линии, как это: 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]; 

    } 

Спасибо заранее.

ответ

10

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

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

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

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

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

UPDATE

В докладе ошибки я подал с Apple, является # 8344719.

+0

я нашел три человека, которые говорят, что сообщил, что ошибка. Не могли бы вы сказать номер ошибки? – nacho4d

+0

Причина, по которой Mail.app не имеет этой проблемы, заключается в том, что она не использует UISearchDisplayController. Ни одно из приложений iPad от Apple не делает, вероятно, поэтому эта ошибка существует. – Darren

+0

Я тоже подал ошибку. Это # 9689005. – Moshe

0

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

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

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

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

0

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

@synthesize tableView; 

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

1

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

if ([self.searchDisplayController.searchBar respondsToSelector:@selector(setCombinesLandscapeBars:)]) 
{ 
    objc_msgSend(self.searchDisplayController.searchBar, @selector(setCombinesLandscapeBars:), NO); 
}