2010-08-10 5 views
7

Ich habe Apples Beispiel "TableSearch" gesehen, das, wenn es berührt wird, seine Scope-Buttons unterhalb der Suchleiste erscheint. http://developer.apple.com/iphone/library/samplecode/TableSearch/Introduction/Intro.htmlWarum werden UISearchBar und die Bereichsschaltflächen in einer Zeile angezeigt?

Aber wenn ich mein eigenes machen es zunächst gut aussieht, aber wenn ich es sieht berühren wie hässlich, Umfang Buttons und Suchleiste sind in der gleichen Zeile wie folgt dargestellt: http://cl.ly/BN9

Was muss ich machen Sie es wie "TableSearch" Beispiel auf dem iPad?

Ich tue alles, was in IB und versuchte, die Suchleiste programmatisch von der Steuerung zu ändern:

- (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]; 

    } 

Vielen Dank im Voraus.

Antwort

10

Ich habe diesen Fehler auch gefunden, und ich habe beide einen Bericht mit Apple eingereicht und um technische Unterstützung gebeten. Ich werde dich wissen lassen, wie es läuft. In der Zwischenzeit gebe ich Ihnen einen kurzen Hintergrund zu diesem Bug.

Um auf dem iPhone wertvolle vertikale Bildschirmeigenschaften im Landscape-Modus zu erhalten, setzt UISearchDisplayController die UISearchBar so, dass Suchleiste und Suchfeld in einem einzigen horizontalen Layout kombiniert werden. Dies funktioniert sehr gut wegen der erhöhten horizontalen Größe des Bildschirms (480 Punkte in Querformat). Leider funktioniert es nicht so gut auf dem iPad, wo im Querformat die UI-Änderung wirklich nicht notwendig ist, weil Sie viele vertikale Immobilien haben. Außerdem haben Sie in der Master-Ansicht des UISplitViewControllers immer noch nur 320 Pixel horizontalen Anzeigebereich, nicht die erhöhten 480 des iPhone. Das Ergebnis ist ein iSore.

Vermutlich ist das Problem, dass sich UISearchDisplayController in seiner Methode "willRotateToInterfaceOrientation: duration:" schlecht verhält. Insbesondere wird nicht überprüft, ob es sich auf einem iPhone befindet oder nicht, bevor die Eigenschaft combinesLandscapeBars in der UISearchBar festgelegt wird. Der private API-Kludon in Ihrem Code funktioniert, da dieser Fehler in UISearchDisplayController behoben wird. Aber natürlich wird Apple die Wut der Alten auf Sie herunterregnen, weil Sie undokumentierte APIs verwenden, also können Sie nicht. Wirklich, wir sind auf diese Weise Apple ausgeliefert.

Wenn Sie bereit sind, die Augenweide und den Komfort von UISearchDisplayController aufzugeben, können Sie eine UISearchBar ohne UISearchDisplayController verwenden und Aspekte der Präsentation selbst verwalten. Offensichtlich erfordert dies viel mehr Code und wäre sinnlos, wenn Apples API-Entwickler ihre Arbeit machen würden, aber es wird zumindest den Anzeigefehler beheben.

Wenn Sie Apple sind, können Sie Ihre eigenen undokumentierten APIs verwenden, weshalb Mail.app dieses Problem nicht hat.

UPDATE

Der Bug-Report ich mit Apple eingereicht habe, ist # 8344719.

+0

fand ich drei Leute, die das sagen haben, dass Fehler gemeldet. Können Sie die Fehlernummer sagen? – nacho4d

+0

Der Grund, warum Mail.app dieses Problem nicht hat, liegt darin, dass UISearchDisplayController nicht verwendet wird. Keine Apples iPad-Apps, weshalb dieser Fehler wahrscheinlich existiert. – Darren

+0

Ich habe auch einen Fehler eingereicht. Es ist # 9689005. – Moshe

0

Wenn legen Sie die Grenzen und Rahmen für die SearchBar, wie für den Rahmen hier:

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

es scheint, als ob es ein Problem mit der Höhe ist. Bereichsschaltflächen erfordern etwas Platz unter der Suchleiste, daher sollten Sie die Höhe beider Grenzen und des Rahmens erhöhen.

Wenn Sie die Bereichsschaltflächen bei bestimmten Ereignissen ein- und ausblenden, müssen Sie die Rahmengröße jedes Mal anpassen.

0

ich dieses Problem auf einem iPad bekommen, aber ich kann es an der Arbeit, wenn ich dies in meiner Implementierung-Datei einfügen:

@synthesize tableView; 

ich dort bin zu raten, ist etwas Schlimmes mit der XIB geladen , aber ich weiß nicht, warum das das beheben würde.

1

Verwendung des folgenden Codes, werden Sie nicht Warnung erhalten:

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