2012-11-01 26 views
7

Khi phân lớp UIView, tôi thường đặt tất cả mã khởi tạo và bố cục của mình theo phương thức init. Nhưng tôi đã nói rằng mã bố cục nên được thực hiện bằng cách ghi đè layoutSuviews. Có một số post trên SO giải thích khi mỗi phương thức được gọi, nhưng tôi muốn biết cách sử dụng chúng trong thực tế.UIView: layoutSubviews vs initWithFrame

Tôi hiện đặt tất cả các mã của tôi trong phương pháp init, như thế này:

MyLongView.m

- (id)initWithHorizontalPlates:(int)theNumberOfPlates 
{ 
    self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)]; 

    if (self) { 
     // Initialization code 
     _numberOfPlates = theNumberOfPlates; 

     UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame]; 
     [scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)]; 
     [self addSubview:scrollView]; 

     for(int i = 0; i < _numberOfPlates; i++){ 
      UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]]; 
      UIImageView *plateImage = [[UIImageView alloc] initWithImage:img]; 
      [scrollView addSubview:plateImage]; 
      plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2); 
     } 

    } 
    return self; 
} 

Đó là nhiệm vụ thường lệ: thiết lập khung của xem, initialising một Ivar, thiết lập lên một scrollview, khởi tạo UIImages, đặt chúng trong UIImageViews, đặt chúng ra.

Câu hỏi của tôi là: điều nào trong số này nên được thực hiện trong init và điều nào trong số này nên được thực hiện trong layoutSubviews?

Trả lời

15

init của bạn nên tạo tất cả các đối tượng, với dữ liệu bắt buộc. Bất kỳ khung nào bạn chuyển cho chúng trong init đều lý tưởng là vị trí bắt đầu của chúng.

Sau đó, trong layoutSubviews :, bạn thay đổi khung của tất cả các phần tử để đặt chúng ở vị trí cần đi. Không phân bổ hoặc bắt đầu sẽ diễn ra trong layoutSubviews :, chỉ thay đổi vị trí, kích thước của chúng, v.v ...

4

Trong trường hợp bạn tự động hoàn thành công việc chỉ với autoresizingFlags hoặc tự động hoàn thành, bạn có thể chỉ cần sử dụng init để thiết lập toàn bộ khung nhìn.

Nhưng nói chung bạn nên làm bố cục trong bố cụcSubviews, vì điều này sẽ được gọi trên mọi thay đổi của khung xem và trong tình huống khác, nơi bố trí là cần thiết một lần nữa. Đôi khi bạn không biết khung cuối cùng của chế độ xem trong init, vì vậy bạn cần phải linh hoạt như đã đề cập hoặc sử dụng layoutSubviews, vì bạn thực hiện bố cục ở đó sau khi kích thước cuối cùng được đặt.

Như đã đề cập bởi WDUK, tất cả việc tạo mã/tạo đối tượng phải ở trong phương thức init hoặc bất kỳ nơi nào, nhưng không trong bố cụcẢnh.

+2

Tôi sẽ đẩy nó xuống dưới. Tạo các đối tượng subview của bạn trong 'viewDidLoad' thay vì init. lượt xem được tải một cách lười biếng và không có lý do gì để tạo các bản xem phụ nếu người giám sát không được tạo ra. – Abizern

+9

Chúng ta đang nói về quan điểm ở đây, không phải ViewController. – calimarkus

Các vấn đề liên quan