2013-08-01 15 views
12

Chcę utworzyć bardzo prosty customView z kilkoma etykietami UIlabel, jak powinienem to zrobić. każdy kurs lub sugestia zostanie doceniona. Jestem na to nowy, nie próbowałem wcześniej.Jak programowo utworzyć niestandardową klasę widoku?

Próbowałem tego z Xib.

@interface MyCustomView : UIView 

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

@end 

Realizacja

#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 

ale muszę to zrobić programowo, proszę o pomoc. Dzięki

+3

To pytanie jest zbyt ogólne, aby uzyskać proste pytanie dotyczące kontroli jakości. Przejdź przez książkę powyżej, która obejmuje wszystko programowo. – bryanmac

+0

przejść przez każdą podstawową książkę do nauki. to jest najbardziej podstawowa rzecz. – iProgrammer

+0

@Ezimettekin Chcesz utworzyć niestandardowy widok w już istniejącej klasie lub chcesz utworzyć klasę UIView z plikiem nib – Vishnu

Odpowiedz

28

Oto prosty sposób, mam nadzieję, że h cię podnieca.

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

Aktualizacja klasa wdrożyć initWithFrame: jak również initWithCoder:, to można nazwać:

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

w kodzie. W ten sposób stworzyłeś programowo (który jest skonfigurowany) programowo.

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

Proszę, popraw mnie, jeśli się mylę: 1. jeśli chcę stworzyć niestandardową zobacz, czy jego * szerokość * ma być względna względem superView, wtedy nie można dokonać manipulacji (związanej z superviewem) w klasie customView. Ograniczenia można wykonywać tylko wtedy, gdy są faktycznie dodawane do superView. 2. Jeśli nie chcę, aby jego szerokość była relatywna, mogę po prostu zainicjować ją ramką stałą lub czymś opartym tylko na rozmiarze ekranu 3. W customView mogę wyświetlać subviews (etykiety, textField itp.) i ich ograniczenia do customView – Honey

+0

@Honey to zwykle nie jest takie proste. widoki generalnie mają teraz przekształconą maskę autorezycyjną na więzy, więc zależy to od konfiguracji. Możesz także użyć podglądu układu i aktualizacji funkcji ograniczeń, aby zaktualizować reguły, które są stosowane ... – Wain

+0

Nie jestem pewien, czy rozumiem cię ... to o co ostatecznie pytam, czy klasa może ustawić ramkę/ograniczenia w stosunku do to jest superView - z własnej klasy? Czy musi zawsze być z superView? – Honey

2

można umieścić te linie w swoim 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]; 
} 

Jest to bardzo prosty przykład .. dodać tylko jedną etykietę można dodać dowolną liczbę przedmiotów, które chcesz programowo .. ze swoimi pożądanych lokalizacjach i rozmiary ramki i cokolwiek właściwości chcesz ...

chyba powinno być przeszukane „UILabel programowo ..

+0

Podwójna równa? (==) – ruandao

5

Mówisz, że nie chcesz korzystać z XIB i chcą zrobić wszystko programowo.

Trzeba wdrożyć metodę 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; 
} 

Więc utworzyć i skonfigurować kontroli (czcionki, kolory, automatycznej zmiany masek itd.) I dodać je jako subviews, wszystko ze sposobu initWithFrame:. Prawdopodobnie chcesz złamać kod na różne sposoby, aby zachować porządek.

Jeśli korzystasz z autouzupełniania, chcesz również utworzyć wszystkie ograniczenia z metody init.

Jeśli jesteś nie przy użyciu autolayout, powinieneś zaimplementować metodę -layoutSubviews. To będzie nazywany w odpowiednim czasie do układu swoje subviews (np gdy rama Państwa zdanie zmianami):

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

Od sposobu layoutSubviews można uzyskać dostęp self.bounds aby dowiedzieć się, rozmiar widoku w tym czasie. Dzięki temu dowiesz się, ile szerokości/wysokości musisz odpowiednio wyrównać lub owinąć.

Jeśli chodzi o tworzenie instancji widoku, wystarczy użyć [[MyCustomView alloc] init] (która będzie wywoływać initWithFrame: z pustym rect) lub [[MyCustomView alloc] initWithFrame:...].Ustaw jego ramkę i dodaj ją do widoku. Metoda layoutSubviews będzie wywoływana we wszystkich odpowiednich momentach i zostanie odpowiednio rozłożona.

2

Utwórz własną podklasę klasy UIView, a następnie przesłoń initWithFrame lub drawRect. Przesłanianie initWithFrame jest łatwiejsze dla początkującego. Plik

nagłówka (.h) powinno rozpocząć się z tym:

@interface YourOwnView : UIView 

... 

@end 

Następnie w pliku wdrażania (.m) należy zaimplementować własną 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; 
} 

Możesz potrzebować dodatkowych danych lub opcji w inicjalizatorze, na przykład tekstu etykiet. W takim przypadku można zdefiniować metodę init z dodatkowymi argumentami:

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText; 
Powiązane problemy