2013-07-17 10 views
11

Nếu tôi đang triển khai AutoLayout có lập trình trong iOS thì có thích hợp để sử dụng phương thức initWithFrame không? Nếu không làm thế nào để khởi tạo một cái nhìn của kích thước ưa thích?Bố cục tự động bằng initWithFrame?

+1

bạn vẫn có thể sử dụng 'initWithFrame' – MZimmerman6

+0

Cảm ơn bạn MZimmerman6. Chúng ta nên tránh mã hóa như vậy hay nó đúng? Đó là nghi ngờ của tôi. – Arock

+0

Cho dù nó thích hợp hay không, nếu nó được thực hiện công việc, cho một cái gì đó đơn giản, chỉ cần sử dụng nó nếu đó là những gì bạn cảm thấy thoải mái với – MZimmerman6

Trả lời

3

Tốt hơn là tránh initWithFrame trừ khi bạn không có lựa chọn nào khác. Với bố cục tự động, cách tiếp cận là xác định hai ràng buộc chỉ định chiều rộng và chiều cao. Có nhiều cách khác nhau để thực hiện điều này, nhưng nếu bạn làm theo cách lập trình, trong phương thức updateViewConstraints của bộ điều khiển xem, hoặc phương thức updateConstraints của chế độ xem, hãy kiểm tra xem các ràng buộc đã được tạo hay chưa và thêm chúng vào chế độ xem của bạn.

Ví dụ:

[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_mySubView]-(200)-|" 
           options:0 
           metrics:nil 
           views:_myViewsDictionary]]; 

[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_mySubView(100)]-|" 
           options:0 
           metrics:nil 
           views:_myViewsDictionary]]; 

Điều đó nói rằng, tốt hơn để làm điều đó bằng Trình tạo giao diện. Một khi bạn đã quen với nó - và nó có một số nhận được sử dụng để - bạn sẽ tìm thấy nó một lần tiết kiệm tuyệt vời và tốt hơn nhiều so với định nghĩa ràng buộc của bạn trong mã.

+0

Điều này không thực sự thuyết phục với tôi. Tôi đồng ý rằng nó ngớ ngẩn để xác định một khung khi bạn sẽ không sử dụng nó, nhưng Apple vẫn nói rằng 'initWithFrame' là initializer được chỉ định cho lớp' UIView' trong tài liệu. Gọi 'init' thay vào đó có vẻ hoạt động tốt, nhưng tôi lo rằng có thể không phải là trường hợp trong các phiên bản iOS trong tương lai. –

+0

nếu bạn sử dụng init, UIView sẽ được khởi tạo qua initWithFrame nhưng với tham số CGRectZero. Vì vậy, bạn đang làm điều tương tự một cách hiệu quả. Bạn sẽ cung cấp khung gì cho initWithFrame? Một khung sẽ không được sử dụng?Bạn cũng có thể vượt qua CGRectZero, đó là chính xác những gì bạn muốn làm nếu bạn chỉ sử dụng init ở nơi đầu tiên. Nó làm cho tất cả các ý nghĩa hơn với bố trí tự động nơi - như bạn đã lưu ý - khung sẽ bị bỏ qua. Trong Swift bạn sẽ thực hiện rất nhiều UIView(). –

+0

Điều đó hoàn toàn có vẻ là phương thức 'init' không có giấy tờ hiện nay, nhưng vì hành vi của' [UIView init] 'không có giấy tờ, nó có thể không đúng trong iOS 9, tại thời điểm đó mã hiện tại có thể bị hỏng. Tôi hoàn toàn đồng ý rằng việc đi qua một khung là câm và việc gọi 'init' hoạt động tốt hôm nay, nhưng điều đó không thay đổi thực tế là Apple đã không ghi lại hành vi này. Vì câu hỏi là cách "thích hợp", tôi không chắc câu trả lời là "dựa vào hành vi không có giấy tờ". –

0

Tại sao không chỉ: myView = [UIView mới];

Nó giống với myView = [[UIView alloc] init]; Nó sẽ làm việc trong trường hợp của bạn nếu sau đó tại một số điểm bạn thêm ràng buộc bắt buộc.

+0

Bạn nên thêm nó làm chú thích. Hoặc thêm nhiều giải thích lý do tại sao điều này sẽ hoạt động. –

+0

Tôi đã sửa đổi câu trả lời của mình. – Ricardo

0
override init(frame: CGRect) { 
    super.init(frame: frame) 
    NSBundle.mainBundle().loadNibNamed("YourView", owner: self, options: nil) 
    self.containerView.frame = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)) 
    self.addSubview(self.containerView) 
} 

Đây là những gì tôi làm ngay bây giờ. tôi làm việc với một số mã di sản và đôi khi nó là tốn thời gian cho tôi để chuyển đổi tất cả mọi thứ để sử dụng autolayout. Một lần nữa, như đã nêu bởi @Max MacLeod Không sử dụng điều này trừ khi bạn không có sự lựa chọn.

+0

Tôi muốn thêm rằng tôi vẫn còn có một ngòi cho quan điểm của tôi. –