2012-10-08 10 views
6

sto cercando per lo stile di tutti i campi di testo in questo modo:Stile tutti i campi UIText contemporaneamente anziché in ogni ViewController?

CGRect frameRect2 = _lastname_field.frame; 
frameRect2.size.height = 30; 

_lastname_field.font = [UIFont fontWithName:@"AppleGothic" size:15]; 
_lastname_field.frame = frameRect2; 
_lastname_field.backgroundColor= [UIColor whiteColor]; 
_lastname_field.layer.cornerRadius = 5.0; 
[_lastname_field.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
[_lastname_field.layer setBorderWidth: 1.0]; 
_lastname_field.clipsToBounds = YES; 

Quel campo sembra grande. L'unico problema è che ci sono oltre 50 campi di testo in tutta l'app. C'è un modo semplice per modellarli tutti allo stesso modo? Alcuni di loro non sono nemmeno stati sintetizzati/nominati.

Grazie!

risposta

9

1) Se si creano i file all'interno del codice, vorrei creare una classe fabbrica con un'interfaccia simile:

@interface MyTextFieldFactory : NSObject 
+ (UITextField*)createStyledTextField; 
@end 

2) Se si creano TextFields con l'Interface Builder, potresti scrivere una categoria su UITextField, che implementa solo awakeFromNib:. Lì fai tutta la tua personalizzazione. Ciò non richiede modifiche al codice, né necessita di modifiche all'interno dei file pennino.

2

Si dovrebbe essere in grado di fare questo per tutte le proprietà eccetto la roba strato di ...

nella vostra AppDelegate aggiungere un metodo di qualcosa di simile ...

- (void)changeAppearances 
{ 
    [[UITextField appearance] setFont:[UIFont fontWithName:@"AppleGothic" size:15]]; 
    [[UITextField appearance] setBackgroundColor:[UIColor whiteColor]]; 
} 

e così via.

Questo imposterà l'aspetto per tutte le istanze UITextField nell'app. (finché non li sovrascrivi nel tuo codice).

+1

hmm ... lo strato di materiale è forse la personalizzazione più importante qui. Non sono sicuro se questo funzionerà – Rohan

+0

Aggiunta una nuova risposta che non richiede la sottoclasse. La sottoclasse è meglio evitare con controlli come questo se possibile. – Fogmeister

+0

come possiamo modellare le proprietà del livello da AppDelegate? – dev27

3

Sottoclasse UITextField e aggiungere la personalizzazione nel metodo initWithFrame. Aggiungi il metodo initWithCoder nella classe personalizzata in cui chiami il super e restituisci [self initWithFrame: [self frame]]. Quindi modifica la classe in Interface Builder per ogni campo di testo.

Sarà qualcosa di simile:

// MyUITextField.h 
@interface MyUITextField : UITextField { 
    // Your IVars 
} 

@property (retain, readonly) float value; 
@end 

// MyUITextField.m 
@implementation MyClass 

- (id)initWithCoder:(NSCoder *)decoder { 

    [super initWithCoder:decoder]; 
    return [self initWithFrame:[self frame]]; 
} 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     // Your customization 
    } 
} 

@end 
+0

Puoi creare una sottoclasse per ottenere i metodi del livello, ma ti consiglio di utilizzare i metodi di aspetto per la maggior parte di esso. – Fogmeister

+0

Ancora abbastanza nuovo per iOS, potresti collegarmi alle risorse su sublclassing? So come modificare le classi in IB, ma non ti seguirò al 100% sugli altri passaggi che hai consigliato – Rohan

+0

Qui vai: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual /objectivec/chapters/occategories.html Risposta aggiornata ;-) – atxe

1

OK, se le apparenze non funzionano, allora la soluzione migliore successivo è quello di scrivere una categoria per fare questo per voi.

La sottoclasse è possibile ma non ideale in quanto vi è la possibilità di ignorare qualcosa che non si dovrebbe (o viceversa).

Aggiungere un file al progetto e selezionare il tipo di categoria e impostare la classe come UITextField.

Nella categoria aggiungere una funzione di qualcosa di simile ...

- (void)configureTextFieldWithFrame:(CGRect)frame; 

Poi nel file .m si può avere ...

- (void)configureTextFieldWithFrame:(CGRect)frame 
{ 
    self.font = [UIFont fontWithName:@"AppleGothic" size:15]; 
    self.frame = frame; 
    self.backgroundColor= [UIColor whiteColor]; 
    self.layer.cornerRadius = 5.0; 
    [self.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
    [self.layer setBorderWidth: 1.0]; 
    self.clipsToBounds = YES; 
} 

Poi solo bisogno di #import UITextField+Configure.h (o qualsiasi altra cosa

Quindi nel codice sostituire il codice con ...

[_lastname_field configureTextFieldWithFrame:frameRect2]; 

Questo eseguirà la funzione di categoria.

1

Sono d'accordo con Fogmeister per i campi di testo creati nel codice. Ma se stai stendendo dei campi di testo in Storyboard, quell'approccio non funzionerà (perché ogni campo definisce esplicitamente le sue proprietà). Ma c'è un modo semplice che funziona.

Fare clic con il tasto destro sullo storyboard e sul codice sorgente "Apri come ...". Ciò pone una rappresentazione XML dell'SB su una finestra dell'editor. È possibile modificare le proprietà del campo di testo globalmente (e/o in modo selettivo) utilizzando l'editor (o copiandole nell'editor XML di propria scelta).

Fair warning, è possibile uccidere il progetto se si introducono errori nell'SB che lo manterranno dalla compilazione, quindi sii molto attento e assicurati di avere un backup per l'SB. Ma se controlli dopo ogni cambio, questa tecnica può funzionare molto bene.

Cerca "<textField" per trovare qualcosa di simile:

<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="name" minimumFontSize="17" clearButtonMode="whileEditing" id="F9N-Tb-KTd"> 
          <rect key="frame" x="176" y="301" width="472" height="31"/> 
          <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 
          <fontDescription key="fontDescription" type="system" pointSize="14"/> 
          <textInputTraits key="textInputTraits" autocapitalizationType="words" enablesReturnKeyAutomatically="YES"/> 
          <connections> 
           <action selector="changeName:" destination="4" eventType="editingDidEnd" id="bLg-iM-m8a"/> 
          </connections> 
         </textField> 

Trova un campo di testo che ha le proprietà FontDescription che ti piace, e uno che non lo fa. Quindi sostituire le proprietà fontDescription che si desidera modificare con le proprietà corrispondenti da quella buona. Assicurati di limitare le modifiche a cose come font, dimensioni e sfondo. Non modificare l'id, il rect o qualsiasi altra cosa che deve essere unica nel campo di testo.

Spero che questo funzioni bene per te, è stata una tecnica molto utile per me per assicurarmi che tutti i miei campi di testo abbiano una tipografia coerente.

(Per tornare alla visualizzazione normale, "Apri con nome ..." Interface Builder - Storyboard)

Buona fortuna!

+0

bello sapere! Sfortunatamente, ho tutti i miei layout dell'interfaccia in pennini separati, non uno storyboard (ci davano problemi GIT). Immagino di poter modificare ogni pennino singolarmente? – Rohan

+0

Io uso SB con GIT tutto il tempo, potreste voler rivisitarlo. Per quanto riguarda la modifica dei file di pennini, non l'ho provato. – jbbenni

Problemi correlati