Ca cao tự động: ưu tiên nội dung so với ưu tiên kháng nén nội dung


643

Tôi không thể tìm thấy câu trả lời rõ ràng trên tài liệu của Apple liên quan đến ca cao tự động về sự khác biệt giữa khả năng ôm và nén nội dung.

Ai đó có thể giải thích tập quán và sự khác biệt của họ?


49
Một trong những bí ẩn lớn của cuộc sống là tại sao họ không gọi nó là "Kháng chiến mở rộng". Hai phẩm chất không gì khác hơn là "Kháng mở rộng" và "Kháng nén" . Thuật ngữ "ôm" là điên rồ.
Fattie

3
Nếu bạn có quá nhiều phòng thì content-hugging: sẽ chiến đấu chống lại không gian trắng. Nó sẽ chỉ buộc tầm nhìn xung quanh bạn. Nhưng nếu bạn không có quá nhiều không gian, và thay vào đó có rất ít chỗ thì content-compressions-resistancesẽ chống lại quan điểm của bạn vì không thể hiển thị tất cả nội dung của nó, ví dụ như các nhãn sẽ bị cắt ngắn.
Mật ong

Câu trả lời:


1319

Tóm tắt nhanh về các khái niệm:

  • Ôm => nội dung không muốn phát triển
  • Nén điện trở => nội dung không muốn thu nhỏ

Thí dụ:

Giả sử bạn có một nút như thế này:

[       Click Me      ]

và bạn đã ghim các cạnh vào một giám sát lớn hơn với mức độ ưu tiên 500.

Sau đó, nếu Ôm ưu tiên> 500, nó sẽ trông như thế này:

[Click Me]

Nếu Ôm ưu tiên <500, nó sẽ trông như thế này:

[       Click Me      ]

Nếu giám sát bây giờ co lại thì, nếu ưu tiên Kháng nén> 500, nó sẽ trông như thế này

[Click Me]

Khác nếu ưu tiên kháng nén <500, nó có thể trông như thế này:

[Cli..]

Nếu nó không hoạt động như thế này thì có lẽ bạn đã có một số ràng buộc khác đang xảy ra đang làm rối tung công việc tốt của bạn!

Ví dụ: bạn có thể ghim nó vào giám sát với mức độ ưu tiên 1000. Hoặc bạn có thể có mức độ ưu tiên chiều rộng. Nếu vậy, điều này có thể hữu ích:

Trình chỉnh sửa> Kích thước cho vừa với nội dung


37
Nếu ôm ưu tiên == 500 thì sao?
bradley.ayers 20/07/13

1
Tôi cho rằng (nhưng đó thường không phải là một ý tưởng hay) nó sẽ được coi là> 500 như hành vi làm tròn thông thường. Chưa thử nghiệm điều đó.
Joshua Nozzi

rất có thể bạn sẽ nhận được cảnh báo "Không thể đồng thời thỏa mãn các ràng buộc" trong thời gian chạy
Max Desiatov

8
@ bradley.ayers Nhận xét của MaxDesyatov, điều đó sẽ chỉ xảy ra nếu bạn có các ràng buộc mâu thuẫn với mức độ ưu tiên Bắt buộc (1000). Nếu hai ràng buộc ưu tiên thấp hơn xung đột, giải pháp không rõ ràng, vì vậy công cụ Bố cục tự động sẽ chỉ chọn một giải pháp hợp lệ và đó là những gì bạn sẽ thấy (không có cảnh báo). Rõ ràng điều này không tốt, bởi vì giờ đây, việc triển khai nội bộ của công cụ Bố cục tự động để chọn cách bố trí của bạn trông như thế nào và về mặt lý thuyết điều này có thể thay đổi từ phiên bản iOS sang phiên bản tiếp theo!
smileyborg

Mặc định ưu tiên ôm nội dung là 250 và mặc định kháng kháng nén nội dung là 750. Vậy tại sao nên sử dụng 500?
ZYiOS

292

Hãy xem video hướng dẫn này về Autolayout , họ giải thích nó một cách cẩn thận

nhập mô tả hình ảnh ở đây


1
@fatuhoku bạn có thể kiểm tra lại không, video này miễn phí
onmyway133

31
Cuộc thảo luận ôm và kháng chiến bắt đầu vào khoảng 13:15 trong video.
Carl Smith

1
@ onmyway133 đây là video hoàn hảo, nhưng thật không may, không có ví dụ nào về cách Ray sử dụng nó.
Matrosov Alexander

@MatrosovAlexander Tôi nghĩ một ví dụ rất thực tế sẽ là chiều cao ô động với Autolayout fantageek.com/1468/ trộm
onmyway133 22/12/14

1
Anh ấy cho thấy làm thế nào để sử dụng kháng nén vào lúc 18:05
Brent Faust

187

nhập mô tả hình ảnh ở đây

nguồn: @mokagio

Kích thước nội dung nội tại - Khá tự giải thích, nhưng các chế độ xem với nội dung thay đổi sẽ nhận thức được nội dung của chúng lớn như thế nào và mô tả kích thước nội dung của chúng thông qua thuộc tính này. Một số ví dụ rõ ràng về chế độ xem có kích thước nội dung nội tại là UIImageViews, UILabels, UIButtons.

Ưu tiên ôm nội dung - Ưu tiên này càng cao, càng nhiều lượt xem càng lớn hơn kích thước nội dung bên trong của nó.

Ưu tiên kháng nén nội dung - Ưu tiên này càng cao, chế độ xem càng co lại nhỏ hơn kích thước nội dung bên trong của nó.

Kiểm tra ở đây để được giải thích thêm: TỰ ĐỘNG TỰ ĐỘNG HẤP DẪN: NỘI DUNG KIẾM TIỀN


Hình minh họa là tốt đẹp nhưng gây hiểu lầm để nói rằng ít nhất. Người đứng đầu nên nói "Tôi sẽ không (để tôi) phát triển". Chế độ xem con tự xác định rằng nó không muốn phát triển thông qua hành vi ôm nội dung của nó. Không có lực ngoại sinh (như bàn tay minh họa) ngăn nó phát triển. Đó là một sự khác biệt lớn.
Manuel

6
Tôi đang bỏ phiếu này chỉ vì tôi thích minh họa.
James Bucanek

3
Đây là lý do tại sao tôi thích mô tả của Stack Overflow dục Snowcrash cộng với minh họa này bởi mokagio = giải thích tốt nhất về các tính chất này ở bất cứ đâu (bao gồm cả tài liệu riêng của Apple).
Kal

40

Giả sử bạn có một nút có chữ "Click Me". Nút đó nên rộng bao nhiêu?

Đầu tiên, bạn chắc chắn không muốn nút nhỏ hơn văn bản. Nếu không, văn bản sẽ được cắt bớt. Đây là ưu tiên kháng nén ngang.

Thứ hai, bạn không muốn nút to hơn mức cần thiết. Một nút trông như thế này, [Click Me], rõ ràng là quá lớn. Bạn muốn nút "ôm" nội dung của nó mà không cần quá nhiều phần đệm. Đây là ưu tiên ôm nội dung ngang. Đối với một nút, nó không mạnh bằng mức ưu tiên kháng nén ngang.


19

Nếu view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, sau đó bố trí tự động tạo ra một ràng buộc đặc biệt của loại NSContentSizeLayoutConstraint. Ràng buộc này hoạt động giống như hai ràng buộc thông thường:

  • một ràng buộc cần view.width <= view.intrinsicContentSize.widthcó với mức độ ưu tiên ôm ngang và
  • một ràng buộc yêu cầu view.width >= view.intrinsicContentSize.widthvới ưu tiên kháng nén ngang.

Trong Swift, với các neo bố cục mới của iOS 9, bạn có thể thiết lập các ràng buộc tương đương như thế này:

let horizontalHugging = view.widthAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)

let horizontalCompression = view.widthAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

Tương tự, nếu view.intrinsicContentSize.height != NSViewNoIntrinsicMetric, thì bố cục tự động tạo ra một NSContentSizeLayoutConstrainthoạt động giống như hai ràng buộc về chiều cao của chế độ xem. Trong mã, chúng sẽ trông như thế này:

let verticalHugging = view.heightAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)

let verticalCompression = view.heightAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

Bạn có thể thấy những NSContentSizeLayoutConstrainttrường hợp đặc biệt này (nếu chúng tồn tại) bằng cách in view.constraintssau khi bố cục đã chạy. Thí dụ:

label.constraints.forEach { print($0) }

// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>

1
không nên: let verticalCompression = view.heightAnchor.constraint (GreaterThanOrEqualToConstant: view.intrinsicContentSize.height)
mc_plectrum

1
Có, tôi đã thực hiện một lỗi sao chép / dán. Tôi đã sửa nó. Cảm ơn bạn đã cho tôi biết.
cướp mayoff

15

Ưu tiên ôm nội dung và nén nội dung Ưu tiên cho các yếu tố có thể tính toán kích thước của chúng về bản chất tùy thuộc vào nội dung sắp xuất hiện.

Từ tài liệu của Apple :

nhập mô tả hình ảnh ở đây


plus1 cho hình ảnh (Y)
Noor Ali Mông

Tôi bối rối. Đối với một TextView không được kích hoạt cuộn. Điều đó có nghĩa là mỗi người dùng gõ kích thước nội tại sẽ thay đổi?
Mật ong

@Honey Tôi nghĩ với các ràng buộc chính xác được đặt và cuộn bị vô hiệu hóa, chế độ xem văn bản sẽ có thể cho biết chiều cao nội tại.
dev gr

Điều đó đã không trả lời câu hỏi của tôi. Ý bạn là nếu tôi gõ rất nhiều, nhiều hơn kích thước hiện tại của textView .... thì textView có tự động mở rộng và thay đổi kích thước nội tại không?
Mật ong

Hãy thử nó. Đặt textview một chiều rộng cố định và vô hiệu hóa cuộn và kiểm tra hành vi mong muốn. Tham khảo stackoverflow.com/a/21287306/1526629 để biết thêm câu trả lời.
dev gr

11

Content hugging prioritygiống như một dải cao su được đặt xung quanh một khung nhìn. Giá trị ưu tiên càng cao, dây cao su càng mạnh và càng muốn ôm vào kích thước nội dung của nó. Giá trị ưu tiên có thể được tưởng tượng như "sức mạnh" của dây cao su

Và điều quan trọng Content Compression Resistancelà, một chế độ xem "chống lại" ngày càng nhỏ hơn Chế độ xem có giá trị ưu tiên kháng cao hơn là chế độ xem sẽ chống nén.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.