2011-10-04 12 views
8

Ho creato una sottoclasse di UIButton per assegnargli un bordo bianco 2px No Radii, e ora sto cercando di "globalmente" impostare il carattere, il colore del carattere e il colore di sfondo a seconda dello stato del pulsante.Sottoclasse UIButton - Impostazione delle proprietà?

Il carattere non impostato. Né i colori o i colori di sfondo. Cosa sta succedendo? Ecco il mio codice. Spero che tu possa aiutare :)

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

Non penso di fare nulla di sbagliato. Ho questa classe, e hanno collegato i pulsanti in IB, e impostare il tipo di classe ...

Grazie,

Benben

risposta

17

Se sono stati creati i pulsanti sottoclasse personalizzata in IB, initWithFrame: non ci sarà chiamato. È necessario eseguire l'override di initWithCoder: o, preferibilmente, creare un metodo di installazione separato chiamato sia da initWithFrame: sia da initWithCoder:.

Per il primo caso:

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

Come esattamente dovrei fare esattamente? Non sono mai stato all'Università, è tutto autodidatta finora ... – topLayoutGuide

+0

Io e te entrambi :). Vedi la risposta aggiornata – jrturton

0

UIButton è un cluster di classe. Non dovresti davvero creare sottoclassi in quanto le classi che rappresenta sono private.

+1

Non è tecnicamente un cluster di classe, ma hai un buon punto, può diventare complicato durante la sottoclasse (vedi http://stackoverflow.com/questions/816024/how-to-override-drawrect-in-uibutton- sottoclasse) e la sottoclasse di UIControl potrebbe essere una scommessa migliore. – jrturton

1

Ecco come lo faccio (senza IB):

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

funziona anche con altri tipi, UIButtonTypeSystem è solo un esempio.

Problemi correlati