2012-10-08 7 views
6

Staram się projektować wszystkich pól tekstowych tak:Wszystkie style UITextField na raz, a nie w każdym 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; 

To pole wygląda świetnie. Jedynym problemem jest to, że w aplikacji jest ponad 50 pól tekstowych. Czy istnieje prosty sposób na stylizowanie wszystkich w ten sam sposób? Niektóre z nich nie zostały nawet zsyntetyzowane/nazwane.

Dzięki!

Odpowiedz

9

1) W przypadku tworzenia plików w kodzie, chciałbym utworzyć klasę fabryki w interfejs tak:

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

2) Jeśli tworzenie pól tekstowych z interfejsem Builder, możesz napisać kategorię na UITextField, która implementuje tylko awakeFromNib:. Tam dokonujesz całej swojej personalizacji. Nie wymaga to zmian w kodzie ani zmian w plikach nib.

2

Powinieneś być w stanie to zrobić dla wszystkich właściwości warstwy z wyjątkiem rzeczy ...

w AppDelegate dodać metoda A coś takiego ...

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

i tak dalej.

Spowoduje to ustawienie wyglądu wszystkich instancji UITextField w aplikacji. (o ile nie zastąpisz ich w swoim kodzie).

+1

hmm ... materiał warstwy jest chyba najważniejszym dostosowaniem tutaj. Nie jestem pewien, czy to zadziała – Rohan

+0

Dodano nową odpowiedź, która nie wymaga podklasy. Jeśli to możliwe, najlepiej unikać podklasowania za pomocą takich kontrolek. – Fogmeister

+0

w jaki sposób możemy styl właściwości warstwy z AppDelegate? – dev27

3

Podklasa UITextField i dodaj swoje dostosowanie w metodzie initWithFrame. Dodaj metodę initWithCoder do niestandardowej klasy, w której wywołasz super i zwróć [self initWithFrame: [self frame]]. Następnie zmień klasę w Kreatorze interfejsu dla każdego pola tekstowego.

To będzie coś takiego:

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

Można ją podklasować, aby uzyskać metody warstwowe, ale polecam używanie metod wyglądu dla większości z nich. – Fogmeister

+0

Wciąż całkiem nowy w systemie iOS, czy mógłbyś powiązać mnie z zasobami w sublclassing? Wiem, jak zmienić zajęcia w IB, ale nie podążam za tobą w 100% w innych zalecanych krokach. – Rohan

+0

Tutaj możesz: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual /objectivec/chapters/occategories.html Odpowiedzi zaktualizowane ;-) – atxe

1

OK, jeśli pozory nie zadziała wówczas obok najlepiej jest napisać kategorię, aby zrobić to za Ciebie.

Podklasy są możliwe, ale nie idealne, ponieważ istnieje możliwość pominięcia czegoś, co nie powinno (lub na odwrót).

Dodaj plik do projektu i wybierz typ kategorii i ustaw klasę jako UITextField.

W kategorii dodać funkcję czegoś podobnego ...

- (void)configureTextFieldWithFrame:(CGRect)frame; 

Następnie w pliku .m można mieć ...

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

Potem wystarczy #import UITextField+Configure.h (lub cokolwiek Twój categoyr jest nazywany

Następnie wpisz swój kod w ...

[_lastname_field configureTextFieldWithFrame:frameRect2]; 

Spowoduje to uruchomienie funkcji kategorii.

1

Zgadzam się z Fogmeister na pola tekstowe utworzone w kodzie. Ale jeśli układasz pola tekstowe na Storyboardach, to podejście nie zadziała (ponieważ każde pole jawnie definiuje jego właściwości). Ale jest łatwy sposób, który działa.

Kliknij prawym przyciskiem myszy na swoim scenopisie i "Otwórz jako ..." Kod źródłowy. To umieszcza reprezentację XML SB w oknie edytora. Tam możesz zmienić właściwości pola tekstowego globalnie (i/lub wybiórczo) za pomocą edytora (lub skopiować do wybranego edytora XML).

Uczciwe ostrzeżenie, możliwe jest zabicie projektu, jeśli wprowadzisz błędy w SB, które uniemożliwią jego kompilację - bądź więc bardzo ostrożny i upewnij się, że masz kopię zapasową SB. Ale jeśli sprawdzasz po każdej zmianie, ta technika może działać bardzo dobrze.

Szukaj „<textField”, aby znaleźć coś takiego:

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

znaleźć jeden pole tekstowe, które ma właściwości FontDescription chcesz, i jeden, który nie. Następnie zamień właściwości fontDescription, które chcesz zmienić, z odpowiednimi właściwościami z tego dobrego. Pamiętaj, aby ograniczyć zmiany, takie jak czcionka, rozmiar i tło. Nie zmieniaj id, rect ani niczego innego, co musi być unikalne dla textfield.

Mam nadzieję, że to ci się spodoba, to bardzo przydatna technika, aby upewnić się, że wszystkie moje pola tekstowe mają spójną typografię.

(Aby powrócić do normalnego widoku, "Otwórz jako ..." Interfejs Builder - Storyboard)

Powodzenia!

+0

Warto wiedzieć! Niestety, mam wszystkie układy interfejsu w oddzielnych stalówkach, a nie storyboard (dawał nam problemy z GIT). Sądzę, że mógłbym modyfikować każdą stalówkę indywidualnie? – Rohan

+0

Używam SB z GIT cały czas, możesz chcieć to powtórzyć. Jeśli chodzi o edycję plików nib, nie próbowałem tego. – jbbenni