2009-11-19 11 views
9

Quando viene visualizzata la tastiera, voglio impostare iliPhone UISearchBar & keyboardAppearance

keyboardAppearance = UIKeyboardAppearanceAlert 

Ho controllato la documentazione e sembra che si può modificare solo la KEYBOARDTYPE.

Questo può essere fatto senza violare alcuna API privata di Apple?

risposta

-2

keyboardAppearance è una proprietà di UITextInputTraitsProtocol, che significa che la proprietà viene impostata tramite l'oggetto TextField. Non sono a conoscenza di cosa sia una tastiera di avviso, dall'SDK è una tastiera adatta per un avviso.

ecco come si accede alla proprietà:

UITextField *myTextField = [[UITextField alloc] init]; 
myTextField.keyboardAppearance = UIKeyboardAppearanceAlert; 

Ora, quando l'utente tocca il campo di testo e la tastiera si presenta, dovrebbe essere quello che vuoi.

+1

vi siete persi il fatto che questo proviene da un UISearchBar e non un UITextField. L'UIKeyboard AppearanceAlert ha uno sfondo trasparente, che voglio mantenere uguale in tutta la mia app. Questo può essere ottenuto come hai dimostrato su UITextFields, tuttavia UISearchBar ha anche un campo di testo al suo interno. Volevo sapere se è possibile impostare l'aspetto della tastiera per questo campo di testo. –

+0

Il mio male. Nei documenti, sembra che non ci sia una proprietà o un metodo per impostare la trasparenza della tastiera sulla classe UISearchBar. È possibile impostare solo il tipo di tastiera. – Justin

27

Questo dovrebbe farlo:

for(UIView *subView in searchBar.subviews) 
    if([subView isKindOfClass: [UITextField class]]) 
     [(UITextField *)subView setKeyboardAppearance: UIKeyboardAppearanceAlert]; 

non ha trovato un altro modo di fare ...

+0

Confermo: funziona: o) Non ho trovato nessun altro modo per ottenerlo. Questa risposta dovrebbe essere accettata. – CedX

+0

Suppongo che funzioni, ma ho trovato una soluzione diversa e più semplice qui: http://stackoverflow.com/questions/1594346/dynamically-changing-keyboard-type-for-a-earchearch – ecotax

+0

@ecotax: stai collegando ad una soluzione riguardo al keyboardType (default, ASCII, Numbers ...), ma questo riguarda la tastieraAppearance (chiaro, scuro) – auco

9

Questo non funziona più su iOS 7 perché la gerarchia vista UISearchBar è cambiato. UITextView è ora una sottoview della prima sottoview (ad es. È nell'array searchBar.subviews[0].subviews).

Un futuro modo più prova per farlo sarebbe quello di controllare in modo ricorsivo l'intera gerarchia vista, e per verificare UITextInputTraits protocollo piuttosto che UITextField, dal momento che questo è ciò che in realtà dichiara il metodo. Un modo pulito per farlo è usare le categorie. Prima di tutto una categoria a UISearchBar che aggiunge questo metodo:

- (void) setKeyboardAppearence: (UIKeyboardAppearance) appearence { 
    [(id<UITextInputTraits>) [self firstSubviewConformingToProtocol: @protocol(UITextInputTraits)] setKeyboardAppearance: appearence]; 
} 

Quindi aggiungere una categoria a UIView che aggiunge questo metodo:

- (UIView *) firstSubviewConformingToProtocol: (Protocol *) pro { 
    for (UIView *sub in self.subviews) 
     if ([sub conformsToProtocol: pro]) 
      return sub; 

    for (UIView *sub in self.subviews) { 
     UIView *ret = [sub firstSubviewConformingToProtocol: pro]; 
     if (ret) 
      return ret; 
    } 

    return nil; 
} 

È ora possibile impostare l'aspetto della tastiera sulla barra di ricerca nella stessa come si farebbe un campo di testo:

[searchBar setKeyboardAppearence: UIKeyboardAppearanceDark]; 
+0

grazie, molto utile! Penso che ci sia un piccolo errore di battitura però: "[sub subviewConformingToProtocol: pro]" dovrebbe essere "[sub firstSubviewConformingToProtocol: pro]" – auco

+0

@ auco grazie, corretto quello! – stonemonk

35

Il modo migliore che ho trovato per fare questo, se si vuole fare per tutta la vostra applicazione, è quello di utilizzare Aspetto su UITextField. Metti questo in AppDelegate all'avvio.

[[UITextField appearance] setKeyboardAppearance:UIKeyboardAppearanceDark]; 
+0

Ho fatto il trucco per me, grazie! – Funkycochise

+0

Molto meglio ora! Grazie – iGranDav

+0

Questo è stato anche per me. Su iOS7. Anche se l'idea di categoria, di seguito, sembra buona. –