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?
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.
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.
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.
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