2012-10-08 29 views
6

estoy tratando con el estilo de todos los campos de texto, así:¿Configura todos los UITextFields a la vez en lugar de cada 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; 

Ese campo se ve muy bien. El único problema es que hay más de 50 campos de texto en toda la aplicación. ¿Hay alguna manera fácil de diseñarlos todos de la misma manera? Algunos de ellos ni siquiera han sido sintetizados/nombrados.

Gracias!

Respuesta

9

1) Si crea sus archivos dentro de su código, me gustaría crear una clase de fábrica con una interfaz como que:

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

2) Si crea sus TextFields con el Interface Builder, podría escribir una categoría en UITextField, que implementa solo awakeFromNib:. Allí haces toda tu personalización. Esto no necesita cambios de código, ni necesita cambios dentro de los archivos de punta.

2

Usted debe ser capaz de hacer esto para todas las propiedades excepto el material de capa ...

en su AppDelegate agregar un método algo así como ...

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

y así sucesivamente.

Esto configurará el aspecto de todas las instancias de UITextField en su aplicación. (siempre que no los sobrescriba en su código).

+1

hmm ... las capas son quizás la personalización más importante aquí. No estoy seguro si esto funcionará – Rohan

+0

Agregó una nueva respuesta que no requiere subclases. La subclasificación es mejor evitar con controles como este si es posible. – Fogmeister

+0

¿cómo podemos diseñar las propiedades de la capa desde AppDelegate? – dev27

3

Subclase UITextField y agregue su personalización en el método initWithFrame. Agregue el método initWithCoder en la clase personalizada donde llama al super y devuelve [self initWithFrame: [self frame]]. Luego cambie la clase en el Interface Builder para cada campo de texto.

será algo como esto:

// 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

Podría crear una subclase para obtener los métodos de capa, pero yo recomendaría usar los métodos de apariencia para la mayor parte. – Fogmeister

+0

Todavía bastante nuevo en iOS, ¿podría vincularme a los recursos de subclasificación? Sé cómo cambiar las clases en IB, pero no te sigo del todo al 100% en los otros pasos que recomiendas – Rohan

+0

Aquí tienes: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual /objectivec/chapters/occategories.html Respuesta actualizada ;-) – atxe

1

bien, si las apariencias no funcionarán entonces su mejor apuesta siguiente es escribir una categoría para hacer esto para usted.

La creación de subclases es posible, pero no es ideal ya que existe la posibilidad de anular algo que no debería (o viceversa).

Agregue un archivo a su proyecto y seleccione el tipo de Categoría y configure la clase como UITextField.

En la categoría de agregar una función algo así como ...

- (void)configureTextFieldWithFrame:(CGRect)frame; 

A continuación, en el archivo .m puede tener ...

- (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; 
} 

Entonces sólo tiene que #import UITextField+Configure.h (o lo que sea su categoyr se llama.

Luego en su código reemplace su código con ...

[_lastname_field configureTextFieldWithFrame:frameRect2]; 

Esto ejecutará su función de categoría.

1

Estoy de acuerdo con Fogmeister para los campos de texto que se crearon en el código. Pero si está diseñando campos de texto en Storyboards, ese enfoque no funcionará (porque cada campo define explícitamente sus propiedades). Pero hay una manera fácil que funciona.

Haga clic con el botón derecho en su guión gráfico y en "Abrir como ..." Código fuente. Eso pone una representación XML del SB en una ventana del editor. Allí puede cambiar las propiedades del campo de texto globalmente (y/o selectivamente) usando el editor (o copiar al editor XML de su elección).

Como advertencia, es posible matar su proyecto si introduce errores en el SB que impidan su compilación, así que tenga mucho cuidado y asegúrese de tener una copia de seguridad para su SB. Pero si revisas cada cambio, esta técnica puede funcionar muy bien.

Búsqueda de "<textField" para encontrar algo como esto:

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

encontrar uno campo de texto que tiene las propiedades FontDescription te gusta, y uno que no lo hace. Luego reemplace las propiedades de fontDescription que desea cambiar con las propiedades correspondientes del bueno. Asegúrese de limitar sus cambios a elementos como la fuente, el tamaño y el fondo. No cambie la identificación, el rect o cualquier otra cosa que necesite ser exclusiva del campo de texto.

Espero que esto funcione bien para usted, ha sido una técnica muy útil para mí para asegurarme de que todos mis campos de texto tengan una tipografía consistente.

(para volver a la vista normal, "Abrir como ..." Interface Builder - Storyboard)

Buena suerte!

+0

¡muy útil! Desafortunadamente, tengo todos los diseños de mi interfaz en distintas partes, no en un guión gráfico (nos estaba dando problemas de GIT). Supongo que podría modificar cada plumilla individualmente? – Rohan

+0

Uso SB con GIT todo el tiempo, es posible que desee volver a visitarlo. En cuanto a la edición de archivos nib, no lo he probado. – jbbenni

Cuestiones relacionadas