2014-09-08 8 views
13

Sto utilizzando UISearchBar nella mia app, con showsScopeBar=YES. Quando si esegue sotto iOS8 (sia nel simulatore che su un dispositivo) la barra dell'oscilloscopio è nascosta e l'altezza della barra di ricerca rimane a 44 anziché l'88 previsto. Usando il nuovo debugger di visualizzazione in Xcode 6 posso vedere che la barra di campo è effettivamente presente, ma rimane nascosto dietro il campo di testo.Altezza UISearchBar su iOS8 quando showsScopeBar = YES

L'unico modo che ho trovato finora è quello di impostare manualmente l'altezza della barra di ricerca su 88, che ovviamente è un terribile hack.

Mi manca qualche incompatibilità documentata, o si tratta di un bug?

risposta

23

Ho incontrato anche questo problema. Dopo aver cercato sul forum degli sviluppatori di Apples, ho trovato questo thread: https://devforums.apple.com/thread/235803?start=0&tstart=0

E a quanto pare la barra di ricerca non esegue automaticamente un sizeToFit quando è supposto anche. Quindi l'altezza rimane a 44 invece di adattarsi ai pulsanti di ambito. Il bug non è stato risolto nel GM iOS8.

Ho fatto un semplice [self.searchBar sizeToFit] nella mia viewWillAppear: e questo lo ha risolto.

+0

Grazie per la vostra risposta, questo ha aiutato un sacco! Controlla la mia risposta per farlo automaticamente e ti risparmia un po 'di digitazione. –

+0

Questo ha sicuramente corretto la barra di ricerca, mostra correttamente la barra di campo, ma nel mio caso si nasconde la prima riga della tabella. – user1544494

+0

Ho anche controllato la versione di iOS 8 .. corregge la barra di ricerca ma nasconde la prima cella di tableview .. C'è comunque una soluzione per risolvere il problema senza nascondere la prima cella della tableview ..? – user1544494

0

Utilizzando Janne's answer, ho pensato che sarebbe stato utile condividere come farlo automaticamente con il metodo 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 
4

Questo sembra non essere un problema iOS 8, ma un problema che Storyboard Xcode 6 GM compilato come avviene su IOS 6/7 pure.

Come suggerito, viene risolto chiamando sizeToFit nella barra di ricerca in viewWillAppear.

Se si desidera eseguire una vista anziché un controller, è possibile provare a collocarlo all'interno di willMoveToWindow.


Questo bug sembra interessare 5.x Xcode si basa su iOS 8 e Xcode 6 GM si basa su tutti i sistemi.

+0

Nel mio caso capita in iOS8 nelle mie app già in AppStore, realizzato con Xcode 5 e SDK7. E la stessa app su iSO7 funziona perfettamente.Quindi è un problema di runtime in iOS8 e, come ho capito dalla risposta sul forum degli sviluppatori che ho collegato sopra, è noto da Apple e probabilmente verrà risolto in una prossima versione di iOS8. – Janne

+0

Avete controllato l'ultima versione? Sto avendo questo problema che è ancora lì in iOS 8, anche se costruito con iOS 7 SDK. – user1544494

+0

Questo è il punto, il bug è nel sistema operativo, non nell'SDK. Quindi, se la tua app non esegue la chiamata sizeToFit, fallirà su iOS8 ma non su iOS7. Non importa quale SDK stai usando. Quello che ha trovato Rivera non è lo stesso bug. – Janne

8

Questo problema si verifica anche nella versione di iOS 8. Ho aggiunto queste 2 righe nella mia viewWillAppear: e questo l'ha risolto.

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } La semplice aggiunta di [self.searchBar sizeToFit] copriva la prima riga della mia vista tabella. L'aggiornamento della testata tableview ha risolto perfettamente il problema.

+0

Grazie! Forzare il reset di tableHeader è molto più bizzarro che dover preoccuparsi dell'ordine di inizializzazione, in particolare quando si desidera mostrare/nascondere la barra dell'ambito in modo dinamico. – Gereon

+0

Felice di averlo aiutato. :) – user1544494

Problemi correlati