web-dev-qa-db-fra.com

Hauteur UISearchBar sur iOS8 lorsque showsScopeBar = YES

J'utilise UISearchBar dans mon application, avec showsScopeBar=YES. Lors de l'exécution sous iOS8 (dans le simulateur et sur un périphérique), la barre d'étendue est masquée et la hauteur de la barre de recherche reste à 44 au lieu de 88. Utilisation du nouveau débogueur de vue dans Xcode 6 Je peux voir que la barre d'étendue est en réalité présent, mais reste caché derrière le champ de texte.

Le seul moyen que j’ai trouvé jusqu’à présent consiste à régler manuellement la hauteur de la barre de recherche sur 88, ce qui bien sûr est un terrible bidouillage.

Me manque-t-il une incompatibilité documentée ou s'agit-il d'un bogue?

13
Gereon

J'ai rencontré ce problème aussi. Après une recherche sur le forum des développeurs Apples, j'ai trouvé le fil suivant: https://devforums.Apple.com/thread/235803?start=0&tstart=0

Et apparemment, le SearchBar ne fait pas automatiquement un sizeToFit quand on le suppose aussi. La hauteur reste donc à 44 au lieu de s’ajuster aux boutons de l’étendue. Le bogue n’est pas corrigé dans le iOS8 GM.

J'ai fait un simple [self.searchBar sizeToFit] dans mon viewWillAppear: et cela l'a résolu.

23
Janne

Ce problème se produit également dans la version iOS 8. J'ai ajouté ces deux lignes dans mon viewWillAppear: et cela l'a résolu.

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } Le simple ajout de [self.searchBar sizeToFit] couvrait la première ligne de ma vue de table. Le simple rafraîchissement de l'en-tête de la vue de table a parfaitement résolu le problème. 

8
megha

Cela ne semble pas être un bogue iOS 8, mais un bogue Storyboard compilé Xcode 6 GM tel qu’il se produit sur iOS 6/7.

Comme suggéré, il est corrigé en appelant sizeToFit dans la barre de recherche dans viewWillAppear.

Si vous voulez le faire depuis une vue au lieu d’un contrôleur, vous pouvez essayer de le placer dans willMoveToWindow.


Ce bogue semble affecter les versions de Xcode 5.x sur iOS 8 et Xcode 6 GM sur tous les systèmes.

4
Rivera

En utilisant La réponse de Janne , j’ai pensé qu’il serait utile de dire comment faire cela automatiquement avec la méthode swizzling.

@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