2013-09-27 232 views
10

Tôi đang cố gắng tạo chế độ xem vùng chứa tùy chỉnh có UIImageView và UILabel nhiều dòng làm phần phụ. Để thực hiện công việc xem độc đáo với autolayout, tôi trọng intrinsicContentSize như sau:UIView với chiều cao động sử dụng nội tạiContentSize

- (CGSize)intrinsicContentSize 
{ 
    return [self sizeThatFits:self.bounds.size]; 
} 

Kích thước tính bằng sizeThatFits có cùng chiều rộng, và điều chỉnh chiều cao để các nhãn và hình ảnh không được cắt bớt. Điều này hoạt động tốt, nhưng tôi đã rất ngạc nhiên khi thấy trong các tài liệu nhận xét sau:

Kích thước nội tại này phải độc lập với khung nội dung vì không có cách nào để tự động truyền đạt chiều rộng thay đổi sang hệ thống bố cục dựa trên một chiều cao thay đổi, ví dụ.

Nếu đúng như vậy, cách tự động điều chỉnh chiều cao hiện tại của lượt xem dựa trên chiều rộng và nội dung của nó là gì? Tôi có nên tiếp cận điều này theo một cách khác không?

+0

Nếu bạn muốn tránh nội dung bị cắt bớt, đó là mức độ ưu tiên kháng nén của chế độ xem vùng chứa phải được tăng lên. –

+1

Khả năng chống nén là mức độ ưu tiên mà tại đó chế độ xem chống lại được thực hiện nhỏ hơn kích thước nội dung nội tại của nó. Nếu kích thước nội dung nội tại là không chính xác, thì điều này sẽ không được sử dụng nhiều. – Tark

Trả lời

4

Để trả lời câu hỏi của riêng tôi, có vẻ như không có giải pháp phù hợp cho tình huống này. Nhìn vào UILabel để lấy cảm hứng, vấn đề ở đây đã được giải quyết với việc bổ sung một thuộc tính preferredMaxLayoutWidth, sau đó có thể được sử dụng như một chiều rộng hạn chế trong quá trình tính toán kích thước nội dung nội tại. Bất kỳ chế độ xem tùy chỉnh nào cũng sẽ cần phải sử dụng một cái gì đó tương tự.

+0

Có, có vẻ như hầu như không có sự giúp đỡ từ Autolayout để thực hiện nó. Câu trả lời của bạn khiến tôi suy nghĩ về cách tiếp cận mà chúng tôi hạn chế chiều rộng xem khi 'preferredMaxLayoutWidth> 0.0f', và nghĩa đen không ràng buộc khác - sử dụng một phao lớn (ví dụ: 99999.0f) cho chiều rộng tính toán kích thước nội dung nội tại. –

1

Tôi nghĩ rằng tài liệu có nghĩa là, containerView của bạn có thể có placeHolderFrame làm khung nội dung.

kích thước nội tại không nên liên quan đến khung nội dung, mà chỉ liên quan đến nội dung phụ của chính nó. Hình ảnh và UILabel của bạn chẳng hạn.

Bạn nên tính cả chiều cao và chiều rộng từ nhãn và hình ảnh. Nên dễ dàng, vì tất cả chúng đều có kích thước nội tại.

Chỉ cần ý kiến ​​của tôi ...

+3

Địa điểmHolderFrame là gì? Đối với vấn đề đó, khung nội dung là gì? Nhãn là một nhãn nhiều dòng, không thể biết chiều cao của nó là bao nhiêu mà không cần biết chiều rộng của khung nhìn bao trùm văn bản. – Tark

0

Tôi đoán bạn có thể sử dụng tài sản preferredMaxLayoutWidth mới UILabel để nhãn bố trí một cách chính xác và sử dụng các phương pháp khác để bố trí công cụ khác.

Something như thế này:

- (void)layoutSubviews 
{ 
    ... 
    [super layoutSubviews]; // get width from solved constraints 
    label.preferredMaxLayoutWidth = label.frame.size.width; // use it 
    [super layoutSubviews]; // update height of a label (probably intrinsicContentSize) 
    ... 
} 
+0

Vấn đề ở đây không phải là cách bố trí chế độ xem một cách chính xác, nó là để cho hệ thống bố trí chiều cao nội tại của chế độ xem, sao cho nó được cung cấp chiều cao chính xác tùy thuộc vào nội dung của nó. – Tark

+0

Quan điểm của tôi về nội dung nội tạiKích thước của nhãn.Với preferredMaxLayoutWidth nó có thể được cập nhật theo cách thân thiện hơn với autolayout (có thể đó là cách táo gợi ý làm việc). –