2012-04-17 9 views
11

Sto provando a creare & utilizzando una sottoclasse UIView molto semplice per un rettangolo con angoli arrotondati. Ho creato una nuova classe come segue:iOS - Crea sottoclasse UIView per il rettangolo arrotondato

RoundedRect.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface RoundedRect : UIView 
@end 

RoundedRect.m

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[self layer] setCornerRadius:10.0f]; 
     [[self layer] setMasksToBounds:YES]; 
    } 
    return self; 
} 
@end 

sto usando iOS 5.1 con storyboard e ho posto la proprietà classe personalizzata in la finestra dell'ispettore IB su 'RoundedRect', ma quando eseguo l'app il rettangolo ha ancora angoli quadrati. Ho perso qualcosa di ovvio?

Grazie Jonathan

risposta

9

Il metodo initWithFrame non viene chiamato quando la vista viene creata un'istanza da un file XIB. Invece, viene chiamato l'inizializzatore initWithCoder:, quindi è necessario eseguire la stessa inizializzazione in questo metodo.

+0

Molte grazie, questo è fatto il trucco! –

+0

Tendo a eseguire ulteriori impostazioni in '-awakeFromNib'. C'è qualche problema con quello? – d11wtq

+1

La differenza è che 'awakeFromNib' viene inviato una volta che tutti gli oggetti sono stati caricati da XIB. Può essere o non essere ciò che si desidera, e suppongo che in molti casi non abbia alcuna importanza. – Krumelur

3

Per le viste caricate da un file NIB, l'inizializzatore designato è initWithCoder:. initWithFame: non viene chiamato in questo caso.

17

Gli altri ragazzi hanno già risposto alla domanda ma vorrei refactoring in questo modo da consentire un uso in pennini e nel codice

#import "RoundedRect.h" 

@implementation RoundedRect 

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

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (void)commonInit; 
{ 
    CALayer *layer = self.layer; 
    layer.cornerRadius = 10.0f; 
    layer.masksToBounds = YES; 
} 

@end 
22

In iOS 5 in su, non c'è assolutamente alcuna necessità di creare una sottoclasse - si può fai tutto da Interface Builder.

  1. Selezionare l'UIView che si desidera modificare.
  2. Vai a Identity Inspector.
  3. In "User Defined & Attributi di runtime", aggiungere "layer.cornerRadius" in Key Path, Type deve essere "Number" e qualsiasi impostazione richiesta.
  4. Inoltre, aggiungere "layer.masksToBounds" come booleano.
  5. Fatto! Senza sottoclassi e tutto in IB.
0

Se UIView carico da Pennino, si dovrebbe utilizzare il metodo

- (void)awakeFromNib