2013-08-01 14 views
12

Voglio creare un customView molto semplice con alcuni UIlabel su di esso, Come dovrei farlo. qualsiasi tutorial o suggerimento sarebbe apprezzato. Sono nuovo di questo, non ho provato prima.Come si crea una classe di visualizzazione personalizzata a livello di programmazione?

Ho provato questo con xib.

@interface MyCustomView : UIView 

@property (strong, nonatomic) IBOutlet UILabel *Label; 

@end 

Attuazione

#import "MyCustomTimer.h" 
@implementation MyCustomView 
-(id)initWithCoder:(NSCoder *)aDecoder{ 
     if ((self = [super initWithCoder:aDecoder])){ 
     [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self  options:nil] objectAtIndex:0]]; 
     } 
    return self; 
} 
@end 

ma ho bisogno di farlo a livello di codice, si prega di aiuto. grazie

+3

Questa domanda è troppo ampia per una semplice domanda di controllo qualità qui. Passa attraverso il libro sopra il quale copre tutto a livello di codice. – bryanmac

+0

passa attraverso qualsiasi libro di apprendimento di base. questa è la cosa più semplice – iProgrammer

+0

@Ezimettekin Si desidera creare una vista personalizzata nella classe già esistente o si desidera creare una classe UIView con il file pennino – Vishnu

risposta

28

Ecco un modo semplice, spero che h ti scalda.

//in subclassed UIView 
#import "CustomView.h" 
@implementation CustomView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    // Initialization code 
    // initilize all your UIView components 
    UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(20,30, 200, 44)]; 
    label1.text = @"i am label 1"; 
    [self addSubview:label1]; //add label1 to your custom view 

    UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(20,80, 200, 44)]; 
    label2.text = @"i am label 2"; 
    [self addSubview:label2]; //add label2 to your custom view 



    [label1 release];//i am using without ARC, comment if u are using ARC 
    [label2 release];//i am using without ARC, comment if u are using ARC 
    } 
    return self; 
    } 



    // in your class where u want to use that view 
    #import "ViewController.h" 
    #import "CustomView.h"//import it 

    @interface ViewController() 

    @end 

    @implementation ViewController 

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    //create your view where u want 
    CustomView *cv = [[CustomView alloc]initWithFrame:CGRectMake(10, 10, 230, 400)]; //create an instance of your custom view 
    [self.view addSubview:cv]; // add to your main view 
    [cv release];//comment if u are using ARC 
} 


3

Aggiornare la classe per implementare initWithFrame: così come initWithCoder:, quindi è possibile chiamare:

[[MyCustomView alloc] initWithFrame:...]; 

nel codice. Così hai creato un'istanza (che è configurata) in modo programmatico.

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     UILabel *label = [[UILabel alloc] initWithFrame:...]; 
     // configure the label 
     [self addSubview:label]; 
    } 
return self; 
} 
+0

Per favore correggimi se ho torto: 1. se voglio creare una custom vista che la sua * larghezza * deve essere relativa alla sua super vista, allora nessuna manipolazione (legata alla superview) può essere fatta nella classe customView. I vincoli possono essere eseguiti solo quando vengono effettivamente aggiunti alla superView. 2. Se non voglio che la sua larghezza sia relativa, posso semplicemente iniziarla con una cornice fissa, o qualcosa appena basata sulla dimensione dello schermo 3. Nella CustomView sono in grado di mostrare le sottoview (etichette, textField, ecc.) e i loro vincoli alla customView – Honey

+0

@Honey di solito non è proprio così semplice. le viste in genere hanno convertito la loro maschera di autoresizzazione in vincoli ora, quindi dipende da come è configurata. Puoi anche utilizzare le sottoview di layout e aggiornare le funzioni di vincoli per aggiornare le regole applicate ... – Wain

+0

Non sono sicuro di averti capito ... quello che sto chiedendo in fin dei conti è che una classe imposta i suoi vincoli/frame relativi a è superView, dalla sua stessa classe? O deve sempre essere dalla superView? – Honey

2

È possibile inserire queste righe nel vostro initWithFrame:

self = [super initWithFrame:frame] 
if (self!=null) { 
// if self has been allocated 

UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 40)]; 
[label setText:@"Label"]; 
[label setTextAlignment:NSTextAlignmentJustified]; 
[self addSubview:label]; 
} 

E 'un esempio molto semplice .. per aggiungere un solo un'etichetta è possibile aggiungere il numero di oggetti che si desidera programatically .. con i tuoi posizioni desiderate e dimensioni dei frame e qualsiasi proprietà che si desidera ...

forse si dovrebbe cercato "UILabel programatically ..

+0

double equal? ​​(==) – ruandao

5

Tu dici che non si desidera utilizzare un XIB e vuole fare tutto a livello di codice.

è necessario implementare il metodo initWithFrame::

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) { 
     // create/initialize your subviews here 
     self.myLabel = [[UILabel alloc] init...]; 

     // configure the label 
     self.myLabel.font = ...; 
     self.myLabel.autoresizingMask = ...; 

     [self addSubview:self.myLabel]; 
    } 

    return self; 
} 

in modo da creare e configurare i controlli (font, i colori, il ridimensionamento automatico maschere etc.) e aggiungerli come subviews, tutto dal metodo initWithFrame:. Probabilmente vorrai suddividere il codice in metodi diversi per mantenere le cose pulite.

Se si utilizza il rollload automatico, si desidera anche creare tutti i vincoli dal metodo init.

Se si è non utilizzando l'autolayout, è necessario implementare il metodo -layoutSubviews. Questo sarà chiamato in tempi opportuni al layout tuoi viste secondarie (ad esempio quando il telaio di lavoro con le modifiche):

- (void)layoutSubviews 
{ 
    self.myLabel.frame = ...; 
} 

Dal metodo layoutSubviews è possibile accedere self.bounds per capire la dimensione della vista in quel momento. Questo ti permetterà di sapere quanta larghezza/altezza devi allineare o avvolgere correttamente le cose.

Quando si crea un'istanza della vista, utilizzare semplicemente [[MyCustomView alloc] init] (che chiamerà initWithFrame: con un rettangolo vuoto) o [[MyCustomView alloc] initWithFrame:...].Imposta la sua cornice e aggiungila a qualche vista. Il metodo layoutSubviews verrà chiamato in tutti gli orari appropriati e verrà impostato di conseguenza.

2

Creare la propria sottoclasse UIView della classe, quindi sovrascrivere initWithFrame o drawRect. Sostituire initWithFrame è più facile per un principiante. file di

tua intestazione (h) dovrebbe iniziare con questo:

@interface YourOwnView : UIView 

... 

@end 

Poi, nel file di implementazione (.m) si dovrebbe implementare il proprio initWithFrame.

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     //ADDING NEW CONTENT 
     UILabel *yourLabel = [[UILabel alloc]init]; 
     //CUSTOMIZE your label's font, text, etc. 
     .... 

     //Add your label to your own view 
     [self addSubview:yourLabel]; 
    } 

    return self; 
} 

Potrebbe essere necessario di dati o le opzioni nel inizializzatore, ad esempio il testo per le etichette. In questo caso è possibile definire un metodo init con argomenti aggiuntivi come questo:

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText; 
Problemi correlati