2011-10-04 24 views
8

Stworzyłem podklasę UIButton, aby nadać jej białą granicę 2px No Radii, a teraz próbuję "globalnie" ustawić jej czcionkę, kolor czcionki i kolor tła w zależności od stanu przycisku.Subklasa UIButton - ustawianie właściwości?

Czcionka nie jest ustawiona. Ani kolory, ani kolory tła. Co się dzieje? Oto mój kod. Mam nadzieję, że możesz pomóc :)

- (id)initWithFrame:(CGRect)frame { 
self = [super initWithFrame:frame]; 
if (self) { 

    [[self titleLabel] setFont:[UIFont fontWithName:@"ZegoeUI" size:18]]; 
    [self setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
    [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    if(self.state == UIControlStateHighlighted) { 
     [self setBackgroundColor:[UIColor whiteColor]]; 
    } 
    else { 
     [self setBackgroundColor:[UIColor blackColor]]; 
    } 
} 
return self; 
} 





// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 

      [self.layer setMasksToBounds:YES]; 
[self.layer setBorderWidth:2.0]; 
[self.layer setCornerRadius:0.0]; 
[self.layer setBorderColor:[[UIColor colorWithWhite:1.0 alpha:1.0] CGColor]]; 
} 

Nie sądzę, że robię coś złego. Mam tej klasy, i powiązane przyciski w IB, i ustawić typ klasy ...

Dzięki,

Benben

Odpowiedz

17

Jeśli utworzono przycisków niestandardowych podklasy w IB, initWithFrame: nie będzie nazywa. Należy zastąpić initWithCoder: lub najlepiej utworzyć osobną metodę konfiguracji, która jest wywoływana zarówno od initWithFrame:, jak i initWithCoder:.

W pierwszym przypadku:

- (id)initWithCoder:(NSCoder*)coder { 
self = [super initWithCoder:coder]; 
if (self) { 

    [[self titleLabel] setFont:[UIFont fontWithName:@"ZegoeUI" size:18]]; 
    [self setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
    [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    if(self.state == UIControlStateHighlighted) { 
     [self setBackgroundColor:[UIColor whiteColor]]; 
    } 
    else { 
     [self setBackgroundColor:[UIColor blackColor]]; 
    } 
} 
return self; 
} 
+0

W jaki sposób dokładnie to omówię? Nigdy nie byłem na Uniwersytecie, to wszystko jest samo-nauczane do tej pory ... – topLayoutGuide

+0

Ty i ja oboje :). Zobacz zaktualizowaną odpowiedź – jrturton

0

UIButton jest klaster klasa. Naprawdę nie powinieneś podklasować, ponieważ klasy, które reprezentuje, są prywatne.

+1

To nie jest technicznie klaster klasy, ale masz dobry punkt, może się skomplikować podczas podklasy (zobacz http://stackoverflow.com/questions/816024/how-to-override-drawrect-in-uibutton- podklasa) i podklasowanie UIControl może być lepszym rozwiązaniem. – jrturton

1

Oto jak to zrobić (bez IB):

+ (instancetype)customButtonWithCustomArgument:(id)customValue { 
    XYZCustomButtom *customButton = [super buttonWithType:UIButtonTypeSystem]; 
    customButton.customProperty = customValue; 
    [customButton customFunctionality]; 
    return customButton; 
} 

współpracuje również z innymi rodzajami, UIButtonTypeSystem jest tylko przykładem.

Powiązane problemy