webentwicklung-frage-antwort-db.com.de

UISearchBar-Höhe unter iOS8, wenn showsScopeBar = YES ist

Ich verwende UISearchBar in meiner App mit showsScopeBar=YES. Unter iOS8 (sowohl im Simulator als auch auf einem Gerät) ist die Bereichsleiste ausgeblendet und die Höhe der Suchleiste bleibt bei 44 anstatt der erwarteten 88. Mit dem neuen View-Debugger in Xcode 6 kann ich feststellen, dass die Bereichsleiste tatsächlich angezeigt wird vorhanden, bleibt aber hinter dem Textfeld verborgen.

Die einzige Möglichkeit, die ich bisher gefunden habe, besteht darin, die Höhe der Suchleiste manuell auf 88 zu setzen, was natürlich ein schrecklicher Hack ist.

Fehlt mir eine dokumentierte Inkompatibilität oder ist dies ein Fehler?

13
Gereon

Ich bin auch auf dieses Problem gestoßen. Nach der Suche im Apples-Entwicklerforum habe ich folgenden Thread gefunden: https://devforums.Apple.com/thread/235803?start=0&tstart=0

Und anscheinend macht die SearchBar nicht automatisch eine sizeToFit, wenn es auch angenommen wird. Die Höhe bleibt also bei 44, anstatt sich an die Zielfernrohrknöpfe anzupassen. Der Fehler ist im iOS8 GM nicht behoben.

Ich habe eine einfache [self.searchBar sizeToFit] in meinem viewWillAppear: und das hat es gelöst.

23
Janne

Dieses Problem tritt auch in der iOS 8-Version auf. Ich habe diese 2 Zeilen in mein viewWillAppear eingefügt: und das hat es gelöst.

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } Das Hinzufügen von [self.searchBar sizeToFit] vertuschte die erste Zeile meiner Tabellenansicht. Nur das Aktualisieren des Tabellenansichts-Headers behebt das Problem perfekt.

8
megha

Dies scheint kein iOS 8-Fehler zu sein, sondern ein von Xcode 6 GM kompilierter Storyboard-Fehler, wie er auch unter iOS 6/7 vorkommt.

Wie vorgeschlagen, wird dies durch Aufrufen von sizeToFit in der Suchleiste in viewWillAppear behoben.

Wenn Sie es von einer Ansicht aus anstelle eines Controllers ausführen möchten, können Sie versuchen, es in willMoveToWindow zu platzieren.


Dieser Fehler scheint Xcode 5.x-Builds auf iOS 8 und Xcode 6 GM-Builds auf allen Systemen zu betreffen.

4
Rivera

Unter Verwendung von Jannes Antwort hielt ich es für hilfreich, mitzuteilen, wie dies mit Methoden-Swizzling automatisch durchgeführt wird.

@implementation UISearchBar (iOS8)

static dispatch_once_t dispatchOnceToken;

+ (void)load {
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)
    {
        dispatch_once(&dispatchOnceToken, ^{
            Class class = [self class];

            SEL originalViewWillAppearSelector = @selector(layoutSubviews);
            SEL swizzledViewWillAppearSelector = @selector(swizzled_layoutSubviews);

            Method originalViewWillAppearMethod = class_getInstanceMethod(class, originalViewWillAppearSelector);
            Method swizzledViewWillAppearMethod = class_getInstanceMethod(class, swizzledViewWillAppearSelector);

            if(class_addMethod(class, originalViewWillAppearSelector, method_getImplementation(swizzledViewWillAppearMethod), method_getTypeEncoding(swizzledViewWillAppearMethod)))
            {
                class_replaceMethod(class, swizzledViewWillAppearSelector, method_getImplementation(originalViewWillAppearMethod), method_getTypeEncoding(originalViewWillAppearMethod));
            }
            else
            {
                method_exchangeImplementations(originalViewWillAppearMethod, swizzledViewWillAppearMethod);
            }
        });
    }
}

- (void)swizzled_layoutSubviews
{
    [self swizzled_layoutSubviews];
    [self sizeToFit];
}

@end
0
Bryan Way