thay đổi kích thước superview sau khi subviews thay đổi động bằng cách sử dụng tự động thanh toán


83

Tôi không thể tin vào tình yêu của thượng đế mà treo siêu chế độ xem thay đổi kích thước này.

Tôi có một UIView *superview với 4 UILabels. 2 chức năng như tiêu đề cho 2 chức năng khác.

Nội dung trong cả 4 đều là động đến từ cơ sở dữ liệu.

SizeToFitvs SizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:, vượt qua UILayoutFittingCompressedSizehoặc UILayoutFittingExpandedSize.

Tôi sử dụng tự động thanh toán theo chương trình và đã đặt chiều cao superview bằng hoặc lớn hơn thành một số giả.

ở đâu và làm thế nào để tôi sử dụng những điều này SizeToFitvs sizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:, vượt qua UILayoutFittingCompressedSizehoặc UILayoutFittingExpandedSize. Tôi đã đọc rất nhiều mẹo ở đây về ngăn xếp nhưng cuối cùng chẳng có kết quả gì.

Tôi có cần phải tính toán lại các ràng buộc cho superview ở đâu đó cụ thể không. Maby đặt chiều cao là ´ @ property` trong lớp bộ điều khiển của nó và xóa và đọc nó? Atm Tôi đã cố gắng đặt mọi thứ ở khắp mọi nơi và sau đó một số. Tôi vẫn nhận được kết quả cuối cùng về kích thước với chiều cao giả và văn bản nổi bên ngoài. Ngay cả sau khi thiết lập clipsToBound trên lượt xem phụ.

Tôi đang vò đầu bứt tóc .. giúp đỡ


1
Này, bạn có thể đăng mã của bạn ở đâu đó trên pastebin hoặc thứ gì đó nếu tôi có thể xem được không? Tôi đang bị một vấn đề tương tự. Đã một tuần trở lên.
esh

Câu trả lời:


104

Nếu bạn đang sử dụng Bố cục Tự động, đây là những gì bạn cần làm:

  1. Đảm bảo rằng bạn không thêm các ràng buộc chiều rộng và / hoặc chiều cao cố định vào bất kỳ chế độ xem phụ nào của mình (tùy thuộc vào (các) thứ nguyên bạn muốn đặt kích thước động). Ý tưởng là để kích thước nội dung bên trong của mỗi lượt xem phụ xác định chiều cao của lượt xem phụ. UILabels đi kèm với 4 ràng buộc ngầm tự động sẽ (với mức ưu tiên ít hơn Bắt buộc) cố gắng giữ cho khung của nhãn ở kích thước chính xác cần thiết để vừa với tất cả văn bản bên trong.

  2. Đảm bảo rằng các cạnh của mỗi nhãn được kết nối chặt chẽ (với các ràng buộc ưu tiên Bắt buộc) với các cạnh của nhau và siêu thị của chúng. Bạn muốn đảm bảo rằng nếu bạn tưởng tượng một trong các nhãn đang phát triển về kích thước, thì điều này sẽ buộc các nhãn khác phải nhường chỗ cho nó và quan trọng nhất là buộc superview cũng phải mở rộng.

  3. Chỉ thêm các ràng buộc vào superview để đặt vị trí của nó, không phải kích thước (ít nhất, không phải cho (các) thứ nguyên mà bạn muốn kích thước động). Hãy nhớ rằng nếu bạn thiết lập các ràng buộc bên trong một cách chính xác, kích thước của nó sẽ được xác định bởi kích thước của tất cả các chế độ xem phụ, vì các cạnh của nó được kết nối với chúng theo một cách nào đó.

Đó là nó. Bạn không cần phải gọi sizeToFithoặc systemLayoutSizeFittingSize:làm cho điều này hoạt động, chỉ cần tải các chế độ xem của bạn và đặt văn bản và đó sẽ là nó. Công cụ bố trí hệ thống sẽ thực hiện các tính toán để bạn giải quyết các hạn chế của mình. (Nếu có bất cứ điều gì, bạn có thể cần phải gọi setNeedsLayoutgiám sát ... nhưng điều này không cần thiết.)


Cảm ơn smileyborg. Một phản hồi muộn vì tôi đang ở giữa một dự án và không hoàn toàn hiểu được những gì bạn đề cập. Bây giờ tôi đã có cơ hội để làm việc một số chi tiết với các ràng buộc trong lập trình và đặc biệt là với constraintsWithVisualFormatvà tôi hoàn toàn có được quan điểm của bạn về subviews chứa kéo dài và kinda đẩy ra SuperView với kích thước của nó :) Cảm ơn một lần nữa
Pedroinpeace

Tôi đồng ý với giải pháp, nhưng nó không hiệu quả với tôi, hãy kiểm tra stackoverflow.com/questions/34635838/…
Omer

Câu trả lời này là ma thuật. Vì vậy, phần của tôi ít nỗ lực hơn để làm cho các lượt xem có vẻ tốt.
Chris

1
Cần lưu ý rằng bạn nên đặt translatesAutoresizingMaskIntoConstraints = NOnếu bạn đang sử dụng xib.
KudoCC

translateAutoresizingMaskIntoConstraints = KHÔNG là câu trả lời cho trường hợp của tôi. Nhưng bây giờ khung xem vùng chứa bị mất và gốc của nó luôn là (0,0), tôi không thể đặt nó đến nơi tôi muốn. stackoverflow.com/questions/45548372/…
karim

24

Sử dụng các chế độ xem vùng chứa

Trong ví dụ sau, tôi có hình ảnh 30x30 và hình ảnh UILabelnày nhỏ hơn chế độ xem có chứa với văn bản giữ chỗ. Tôi cần chế độ xem chứa ít nhất phải lớn bằng hình ảnh, nhưng nó cần phát triển để chứa văn bản nhiều dòng.

Ở định dạng trực quan, vùng chứa bên trong trông như thế này:

H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-|
V:|[image(30.0)]|
V:|[label(>=30.0)]|

Sau đó, đặt chế độ xem chứa để khớp với chiều cao của nhãn. Bây giờ chế độ xem chứa sẽ có kích thước của nhãn.

Như @smileyborg đã chỉ ra trong câu trả lời của mình, việc kết nối nội dung một cách chặt chẽ với chế độ xem siêu cấp thông báo cho công cụ bố cục rằng chế độ xem vùng chứa đơn giản sẽ khiến nó phát triển.

Hình chữ nhật căn chỉnh màu vàng

Nếu bạn muốn các hình chữ nhật căn chỉnh màu vàng thêm -UIViewShowAlignmentRects YESvào danh sách các đối số chạy của lược đồ.

Nhãn có nhiều dòng


12
-UIViewShowAlignmentRects YES- mẹo hay!
Ralfonso

2
Trong trường hợp này, hộp chứa chỉ phải điều chỉnh chiều cao của nó với nhãn. Điều gì sẽ xảy ra nếu vùng chứa phải thích ứng với tổng chiều cao của nhiều hơn một chế độ xem?
da Rocha Pires

7

Điều này đã được thực hiện dễ dàng hơn đáng kể với sự ra đời của Chế độ xem ngăn xếp trong iOS 9. Sử dụng chế độ xem ngăn xếp bên trong chế độ xem của bạn để chứa tất cả nội dung của bạn có thể thay đổi kích thước và sau đó chỉ cần gọi

view.setNeedsUpdateConstraints()
view.updateConstraintsIfNeeded()
view.setNeedsLayout()
view.layoutIfNeeded()

sau khi thay đổi nội dung của bạn. Sau đó, bạn có thể có được kích thước mới của mình bằng cách gọi

view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

nếu bạn cần tính toán kích thước chính xác cần thiết cho một khung nhìn.


2
Tôi đang sử dụng StackView và tự động thêm các chế độ xem, các chế độ xem này sẽ không được thay đổi kích thước. @ JacobRuth
Mansuu ....

6

Điều này gần như theo sau câu trả lời của @smileyborg và đi kèm với một ví dụ cụ thể.

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

Sẽ không mô tả tất cả các ràng buộc, nhưng những ràng buộc liên quan đến việc tính toán chiều cao của các đối tượng UI.

  1. [Nhãn] Nhãn không được có một heightràng buộc cố định , trong trường hợp này, AutoLayout sẽ không thay đổi kích thước nhãn để phù hợp với văn bản, do đó, thiết lập các ràng buộc về cạnh là chìa khóa. (mũi tên xanh)
  2. [Subview] Bước 1 và 3 rất dễ làm theo, nhưng bước này có thể bị hiểu nhầm. Như trong trường hợp với nhãn, các lần xem phụ không được có heightbộ ràng buộc. Tất cả các chế độ xem phụ phải có topbộ ràng buộc, bỏ qua bottomràng buộc, điều này có thể khiến bạn nghĩ rằng sẽ kích hoạt ngoại lệ ràng buộc không thỏa mãn trong thời gian chạy, nhưng sẽ không xảy ra nếu bạn đặt bottomgiới hạn cho lần xem phụ cuối cùng. Thiếu để làm như vậy sẽ thổi bố cục. (mũi tên đỏ)

  3. [Superview] Đặt tất cả các ràng buộc theo cách bạn cần, nhưng hãy chú ý đến các heightràng buộc. Gán cho nó một giá trị ngẫu nhiên, nhưng hãy làm cho nó tùy chọn, AutoLayout sẽ đặt chính xác chiều cao để vừa với các lượt xem phụ. (mũi tên xanh lam)

Điều này hoạt động hoàn hảo, không cần phải gọi thêm bất kỳ phương pháp cập nhật bố cục hệ thống nào.


cách đặt chiều cao tùy chọn .. Tôi mới sử dụng iOS nên không thể tìm ra được. cảm ơn
Faisal Naseer
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.