2013-08-01 26 views
12

Tôi muốn tạo một customView rất đơn giản với một vài UIlabel trên đó, Làm thế nào tôi nên làm điều này. bất kỳ hướng dẫn hoặc đề xuất nào sẽ được đánh giá cao. Tôi mới đến điều này, đã không thử trước.Làm cách nào để tạo lớp chế độ xem tùy chỉnh theo lập trình?

Tôi đã thử điều này bằng xib.

@interface MyCustomView : UIView 

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

@end 

Thực hiện

#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 

Nhưng tôi cần phải làm điều đó theo chương trình, xin vui lòng giúp đỡ. nhờ

+3

Câu hỏi này quá rộng đối với câu hỏi QA đơn giản tại đây. Đi qua cuốn sách ở trên bao gồm tất cả mọi thứ theo chương trình. – bryanmac

+0

đi qua bất kỳ cuốn sách học tập cơ bản nào. Đây là điều cơ bản nhất – iProgrammer

+0

@Ezimettekin Bạn muốn tạo chế độ xem tùy chỉnh trong lớp đã tồn tại hoặc bạn muốn tạo lớp UIView với tệp nib – Vishnu

Trả lời

28

đây là một cách đơn giản, hy vọng nó h elps bạn.

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

Cập nhật lớp học của bạn để thực hiện initWithFrame: cũng như initWithCoder:, sau đó bạn có thể gọi:

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

Trong mã của bạn. Vì vậy, bạn đã tạo một cá thể (được cấu hình) theo chương trình.

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

Vui lòng sửa tôi nếu tôi sai: 1. nếu tôi muốn tạo tùy chỉnh xem rằng * width * của nó là tương đối so với superView của nó thì không có thao tác nào (liên quan đến superview) có thể được thực hiện trong lớp customView. Các ràng buộc chỉ có thể được thực hiện khi nó thực sự được thêm vào superView. 2. Nếu tôi không muốn chiều rộng của nó là tương đối thì tôi có thể chỉ đơn giản là init nó với một khung cố định, hoặc một cái gì đó chỉ dựa trên kích thước màn hình 3. Trong customView tôi có thể subviews (nhãn, textField, vv) và những hạn chế của họ đối với customView – Honey

+0

@ Honey nó thường không hoàn toàn đơn giản. nhìn chung thường có mặt nạ autoresizing của họ chuyển đổi thành ràng buộc bây giờ để nó phụ thuộc vào cách đó là cấu hình. Bạn cũng có thể sử dụng các subviews bố trí và cập nhật các ràng buộc chức năng để cập nhật các quy tắc được áp dụng ... – Wain

+0

Tôi không chắc tôi hiểu bạn ... những gì tôi cuối cùng hỏi là một lớp có thể đặt khung/ràng buộc của nó liên quan đến đó là superView — từ lớp riêng của nó? Hoặc nó phải luôn luôn là từ superView? – Honey

2

Bạn có thể đặt những dòng này trong initWithFrame của bạn:

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

nó một ví dụ rất đơn giản .. để thêm chỉ là một nhãn bạn có thể thêm bao nhiêu đối tượng mà bạn muốn programatically .. với các địa điểm mong muốn của bạn và kích cỡ khung hình và bất cứ điều gì thuộc tính bạn muốn ...

có lẽ bạn nên đã tìm kiếm "UILabel programatically ..

+0

đôi bằng nhau? (==) – ruandao

5

Bạn nói rằng bạn không muốn sử dụng một XIB và muốn làm điều đó tất cả các lập trình.

Bạn cần phải thực hiện các phương pháp 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; 
} 

Vì vậy, bạn tạo và cấu hình điều khiển của bạn (phông chữ, màu sắc, autoresizing mặt nạ vv) và thêm chúng như subviews, tất cả từ phương pháp initWithFrame:. Bạn có thể muốn phá vỡ mã ra thành các phương pháp khác nhau để giữ cho mọi thứ sạch sẽ.

Nếu bạn đang sử dụng tính năng tự động trả lời, bạn cũng muốn tạo tất cả các ràng buộc của mình từ phương thức init.

Nếu bạn đang không sử dụng tính năng tự động trả lời, bạn nên triển khai phương thức -layoutSubviews. Điều này sẽ được gọi vào những thời điểm thích hợp để bố trí subviews của bạn (ví dụ khi khung nhìn thay đổi của bạn):

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

Từ phương pháp layoutSubviews bạn có thể truy cập vào self.bounds để tìm ra kích thước của quan điểm lúc bấy giờ. Điều này sẽ cho bạn biết có bao nhiêu chiều rộng/chiều cao bạn phải sắp xếp hoặc bọc mọi thứ một cách chính xác.

Khi nói đến việc tạo thể hiện chế độ xem của bạn, chỉ cần sử dụng [[MyCustomView alloc] init] (gọi là initWithFrame: với khoảng trống) hoặc [[MyCustomView alloc] initWithFrame:...].Đặt khung của nó và thêm nó vào một số xem. Phương pháp layoutSubviews sẽ được gọi vào tất cả các thời điểm thích hợp và sẽ được bố trí tương ứng.

2

Tạo lớp con của riêng bạn UIView, sau đó ghi đè initWithFrame hoặc drawRect. Ghi đè initWithFrame dễ dàng hơn cho một newbie.

tiêu đề của bạn (.h) tập nên bắt đầu với điều này:

@interface YourOwnView : UIView 

... 

@end 

Sau đó, trong tập tin thực thi (.m), bạn nên thực hiện initWithFrame của riêng bạn.

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

Bạn có thể cần thêm dữ liệu hoặc tùy chọn trong bộ khởi tạo, ví dụ như văn bản cho nhãn. Trong trường hợp này, bạn có thể xác định phương thức init với các đối số thừa như sau:

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText; 
Các vấn đề liên quan