ที่มา: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
ขนาดเนื้อหาที่แท้จริงของข้อความแบบหลายบรรทัด
ขนาดเนื้อหาภายในของ UILabel และ NSTextField นั้นไม่ชัดเจนสำหรับข้อความหลายบรรทัด ความสูงของข้อความขึ้นอยู่กับความกว้างของบรรทัดซึ่งยังไม่สามารถระบุได้เมื่อแก้ไขข้อ จำกัด เพื่อแก้ไขปัญหานี้ทั้งสองคลาสมีคุณสมบัติใหม่ที่เรียกว่า PreferredMaxLayoutWidth ซึ่งระบุความกว้างของบรรทัดสูงสุดสำหรับการคำนวณขนาดเนื้อหาที่แท้จริง
เนื่องจากปกติเราไม่ทราบค่านี้ล่วงหน้าเราจึงต้องใช้วิธีสองขั้นตอนเพื่อให้ได้สิ่งนี้ อันดับแรกเราปล่อยให้ Auto Layout ทำงานแล้วจากนั้นเราใช้เฟรมผลลัพธ์ในเค้าโครงผ่านเพื่ออัปเดตความกว้างสูงสุดที่ต้องการและเค้าโครงทริกเกอร์อีกครั้ง
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
การเรียกครั้งแรกไปที่ [super layoutSubviews] เป็นสิ่งจำเป็นสำหรับฉลากที่จะได้รับการตั้งค่าเฟรมในขณะที่การเรียกครั้งที่สองจำเป็นต้องปรับปรุงเค้าโครงหลังจากการเปลี่ยนแปลง หากเราละเว้นการโทรครั้งที่สองเราจะได้รับข้อผิดพลาด NSInternalInconsistencyException เนื่องจากเราได้ทำการเปลี่ยนแปลงในเลย์เอาต์พาสซึ่งต้องการการอัปเดตข้อ จำกัด แต่เราไม่ได้ทริกเกอร์เลย์เอาต์อีกครั้ง
เรายังสามารถทำสิ่งนี้ได้ในคลาสย่อยของเลเบลเอง:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
ในกรณีนี้เราไม่จำเป็นต้องเรียกใช้ [super layoutSubviews] ก่อนเพราะเมื่อ layoutSubviews ถูกเรียกเรามีเฟรมอยู่บนฉลากแล้ว
ในการปรับค่านี้จากระดับตัวควบคุมมุมมองเราขอเชื่อมโยงเข้ากับ viewDidLayoutSubviews ณ จุดนี้เฟรมของการผ่านเลย์เอาต์อัตโนมัติครั้งแรกได้ถูกตั้งค่าไว้แล้วและเราสามารถใช้มันเพื่อตั้งค่าความกว้างสูงสุดที่ต้องการ
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
สุดท้ายตรวจสอบให้แน่ใจว่าคุณไม่มีข้อจำกัดความสูงอย่างชัดเจนบนฉลากที่มีลำดับความสำคัญสูงกว่าลำดับความสำคัญในการบีบอัดเนื้อหาของฉลาก มิเช่นนั้นจะทรัมป์ความสูงที่คำนวณได้ของเนื้อหา ตรวจสอบให้แน่ใจว่าได้ตรวจสอบข้อ จำกัด ทั้งหมดที่อาจส่งผลต่อความสูงของฉลาก