Mặc dù câu hỏi nêu lập trình, gặp phải vấn đề tương tự và thích làm việc trong Trình tạo giao diện, tôi nghĩ rằng có thể hữu ích khi thêm vào các câu trả lời hiện có bằng giải pháp Trình tạo giao diện.
Điều đầu tiên là quên đi sizeToFit
. Bố cục tự động sẽ xử lý việc này thay mặt bạn dựa trên kích thước nội dung bên trong.
Do đó, vấn đề là làm thế nào để có một nhãn phù hợp với nội dung của nó với Bố cục tự động? Cụ thể - bởi vì câu hỏi đề cập đến nó - chiều cao. Lưu ý rằng các nguyên tắc tương tự áp dụng cho chiều rộng.
Vì vậy, hãy bắt đầu với một ví dụ UILabel có chiều cao được đặt thành cao 41px:
Như bạn có thể thấy trong màn hình lấy ở trên, "This is my text"
có phần đệm ở trên và bên dưới. Đó là phần đệm giữa chiều cao của UILabel và nội dung của nó, văn bản.
Nếu chúng ta chạy ứng dụng trong trình giả lập, chắc chắn, chúng ta sẽ thấy điều tương tự:
Bây giờ, hãy chọn UILabel trong Trình tạo giao diện và xem các cài đặt mặc định trong Trình kiểm tra kích thước:
Lưu ý các ràng buộc được tô sáng ở trên. Đó là Ưu tiên ôm nội dung . Như Erica Sadun mô tả nó trong Giao diện tự động tuyệt vời của iOS được phân loại , đây là:
cách một khung nhìn thích tránh phần đệm thêm xung quanh nội dung cốt lõi của nó
Đối với chúng tôi, với UILabel, nội dung cốt lõi là văn bản.
Ở đây chúng tôi đi đến trung tâm của kịch bản cơ bản này. Chúng tôi đã đưa ra nhãn văn bản của chúng tôi hai ràng buộc. Họ xung đột. Một người nói "chiều cao phải bằng 41 pixel" . Người khác nói "ôm tầm nhìn vào nội dung của nó để chúng tôi không có thêm phần đệm" . Trong trường hợp của chúng tôi, hãy xem chế độ xem văn bản để chúng tôi không có thêm phần đệm.
Bây giờ, với Bố cục tự động, với hai hướng dẫn khác nhau có thể làm những việc khác nhau, thời gian chạy phải chọn cái này hoặc cái kia. Nó không thể làm cả hai. Nhãn UIL không thể cao cả 41 pixel và không có phần đệm.
Cách giải quyết vấn đề này là bằng cách chỉ định mức độ ưu tiên. Một hướng dẫn phải có mức độ ưu tiên cao hơn hướng dẫn khác. Nếu cả hai hướng dẫn đều nói những điều khác nhau và có cùng mức độ ưu tiên, một ngoại lệ sẽ xảy ra.
Vì vậy, hãy cho nó đi. Hạn chế chiều cao của tôi có mức độ ưu tiên là 1000 , được yêu cầu . Chiều cao ôm nội dung là 250 , yếu . Điều gì xảy ra nếu chúng ta giảm mức ưu tiên ràng buộc chiều cao xuống còn 249 ?
Bây giờ chúng ta có thể thấy điều kỳ diệu bắt đầu xảy ra. Hãy thử trong sim:
Tuyệt vời! Nội dung ôm nhau đạt được. Chỉ vì ưu tiên chiều cao 249 nhỏ hơn ưu tiên ôm nội dung 250 . Về cơ bản, tôi đang nói "chiều cao tôi chỉ định ở đây ít quan trọng hơn chiều cao tôi đã chỉ định cho nội dung ôm" . Vì vậy, nội dung ôm chiến thắng.
Dòng dưới cùng, làm cho nhãn phù hợp với văn bản có thể đơn giản như chỉ định ràng buộc chiều cao - hoặc chiều rộng - và cài đặt chính xác mức độ ưu tiên liên quan đến ràng buộc ưu tiên nội dung của trục đó.
Sẽ để lại làm tương đương cho chiều rộng như một bài tập cho người đọc!
label.sizeToFit()
trong Xcode / viewControll, các ràng buộc là đủ. đã không tạo nhãn trong Sân chơi . Cho đến nay, cách duy nhất tôi thấy nó hoạt động trong Playground là làmlabel.sizeToFit()