2012-10-08 9 views
14

Tôi có chế độ xem thực hiện bố cục của các phần phụ trong mã. Bố cục quá phức tạp đối với bố cục tự động và bố cục tự động sẽ phá vỡ mã bố cục. Có cách nào để buộc bố cục tự động rời khỏi chế độ xem phụ của chế độ xem này một mình không? Tôi đã cố gắng ghi đè bố cụcSubviews, nhưng không có niềm vui.Chọn không tham gia bố cục tự động cho một chế độ xem duy nhất?

Cảm ơn bạn đã được trợ giúp.

Trả lời

5

Bố cục tự động được bật hoặc tắt trên bảng phân cảnh hoặc XIB. Nếu chế độ xem của bạn nằm trong XIB của riêng mình thì bạn có thể tắt bố cục tự động cho XIB đó. Nếu có các chế độ xem khác trong XIB của bạn dựa trên bố cục tự động, bạn sẽ phải tìm một giải pháp khác.

+1

Đặt nó vào NIB của chính nó có vẻ là giải pháp duy nhất. –

+0

Vâng, bạn không thể bật hoặc tắt nó mỗi cảnh. – Flea

+0

Bạn * có thể * xem xét vị trí theo cách thủ công (tức là đặt khung hình) cho một chế độ xem nhất định miễn là bạn thực hiện * sau * công cụ bố cục tự động được thực hiện với chúng (xem câu trả lời của tôi bên dưới). – wcochran

2

Tìm câu trả lời trong video WWDC. layoutSubviews không hoạt động giống với bố cục tự động như trước đây. Nó không ngừng bố trí tự động xảy ra, mà đúng hơn là một cơ hội để thêm/thay đổi/loại bỏ các ràng buộc trong khi bố trí.

Đêm qua tôi đã thử di chuyển chế độ xem tùy chỉnh sang một NIB khác và điều đó có vẻ là giải pháp duy nhất.

2

You can mix auto layout and manual layout!

Chừng nào none của subviews của view được tham gia vào bất kỳ hạn chế bố trí tự động mà sẽ kích hoạt một bố cục tự động truyền lại quan điểm đó, bạn có thể ghi đè lên layoutSubviews và thiết lập khung trên mỗi subview bằng tay:

class MyView : UIView { 

    // 
    // mySubview is not involved in any constraints 
    // that would trigger another layout pass. 
    // e.g., no explicit constraints set in IB. 
    // 
    @IBOutlet weak var mySubview: UIView! 

    override func layoutSubviews() { 
     super.layoutSubviews() // let auto layout engine run first 

     // 
     // Auto layout engine now done with this view so we can 
     // set the frames how ever we wish since we have the last 
     // word! 
     // 
     mySubview.frame = CGRectMake(...) 
     ... 

    } 

} 

lý do làm việc này là sau khi super.layoutSubviews() được gọi, thay đổi khung trên bất kỳ bản xem nào nào không kích hoạt một đường viền bố cục khác (tất cả các ràng buộc liên quan đến các bản xem trước đều hài lòng và công cụ bố cục tự động được thực hiện với chúng); do đó phương pháp này nhận được từ cuối cùng về vị trí của các bản xem trước của nó!

  • Lưu ý rằng MyView trường thể đã liên quan đến hạn chế bố trí tự động thiết lập và tất cả mọi thứ hoạt động tốt.

  • IB phát không cảnh báo miễn là bạn làm không đặt bất kỳ trở ngại trên subviews.

+0

Trên macOS, phương thức để phân lớp sẽ là 'layout'. – Demitri