คุณกำลังพบกับผลข้างเคียงของคุณสมบัติใหม่ที่ยอดเยี่ยมใน Tableviews ของ iOS8: Automatic Row Heights
ใน iOS 7 คุณมีแถวขนาดคงที่ (ตั้งค่าด้วยtableView.rowHeight
) หรือคุณจะเขียนโค้ดเพื่อคำนวณความสูงของเซลล์ของคุณและคุณจะส่งกลับมาในtableView:heightForRowAtIndexPath
มา การเขียนโค้ดเพื่อคำนวณความสูงของเซลล์อาจค่อนข้างซับซ้อนหากคุณมีมุมมองจำนวนมากในเซลล์ของคุณและคุณมีความสูงที่แตกต่างกันในการพิจารณาขนาดตัวอักษรที่แตกต่างกัน เพิ่มในประเภทไดนามิกและกระบวนการนี้เป็นความเจ็บปวดในตูด
ใน iOS 8 คุณยังสามารถทำสิ่งต่างๆข้างต้นได้ แต่ตอนนี้ iOS สามารถกำหนดความสูงของแถวได้โดยมีเงื่อนไขว่าคุณได้กำหนดค่าเนื้อหาของเซลล์โดยใช้เค้าโครงอัตโนมัติ นี่เป็นประโยชน์อย่างมากสำหรับนักพัฒนาเนื่องจากขนาดตัวอักษรแบบไดนามิกเปลี่ยนไปหรือผู้ใช้แก้ไขขนาดตัวอักษรโดยใช้การตั้งค่าการเข้าถึง UI ของคุณจะปรับให้เข้ากับขนาดใหม่ได้ นอกจากนี้ยังหมายความว่าหากคุณมี UILabel ที่สามารถมีข้อความได้หลายแถวตอนนี้เซลล์ของคุณจะเติบโตขึ้นเพื่อรองรับสิ่งเหล่านี้เมื่อเซลล์ต้องการและหดตัวเมื่อไม่มีดังนั้นจึงไม่มีช่องว่างที่ไม่จำเป็น
ข้อความเตือนที่คุณเห็นกำลังบอกคุณว่ามีข้อ จำกัด ไม่เพียงพอในเซลล์ของคุณสำหรับการจัดวางอัตโนมัติเพื่อแจ้งความสูงของเซลล์ในมุมมองตาราง
หากต้องการใช้ความสูงของเซลล์แบบไดนามิกซึ่งรวมถึงเทคนิคที่ผู้โพสต์อื่น ๆ กล่าวถึงแล้วจะกำจัดข้อความนี้ด้วยคุณต้องแน่ใจว่าเซลล์ของคุณมีข้อ จำกัด เพียงพอที่จะผูกรายการ UI ไว้ที่ด้านบนและด้านล่างของเซลล์ หากคุณเคยใช้การจัดวางอัตโนมัติมาก่อนคุณอาจคุ้นเคยกับการตั้งค่าข้อ จำกัด ด้านบน + ชั้นนำ แต่ความสูงของแถวแบบไดนามิกก็ต้องใช้ข้อ จำกัด ด้านล่างเช่นกัน
เลย์เอาต์พาสจะทำงานในลักษณะนี้ซึ่งเกิดขึ้นทันทีก่อนที่เซลล์จะแสดงบนหน้าจอในลักษณะที่ทันเวลา:
มีการคำนวณขนาดของเนื้อหาที่มีขนาดที่แท้จริง ซึ่งรวมถึง UILabels และ UIImageViews ซึ่งมิติข้อมูลจะขึ้นอยู่กับข้อความหรือ UIImages ที่มีตามลำดับ มุมมองทั้งสองนี้จะถือว่าความกว้างเป็นที่ทราบกันดี (เนื่องจากคุณได้กำหนดข้อ จำกัด สำหรับการต่อท้าย / ขอบนำหน้าหรือคุณตั้งค่าความกว้างที่ชัดเจนหรือคุณใช้ข้อ จำกัด แนวนอนซึ่งจะเปิดเผยความกว้างจากด้านหนึ่งไปอีกด้านหนึ่งในที่สุด) สมมติว่าป้ายกำกับมีข้อความย่อหน้า ("จำนวนบรรทัด" ถูกตั้งค่าเป็น 0 เพื่อให้ตัดข้อความอัตโนมัติ) สามารถมีได้ 310 จุดเท่านั้นดังนั้นจึงกำหนดให้สูง 120pt ที่ขนาดแบบอักษรปัจจุบัน
UI ถูกจัดวางตามข้อ จำกัด ในการวางตำแหน่งของคุณ มีข้อ จำกัด ที่ด้านล่างของฉลากที่เชื่อมต่อกับขอบด้านล่างของเซลล์ เนื่องจากป้ายมีความสูง 120 พอยต์และเนื่องจากถูกผูกไว้ที่ด้านล่างของเซลล์ตามข้อ จำกัด จึงต้องดันเซลล์ "ลง" (เพิ่มความสูงของเซลล์) เพื่อให้เป็นไปตามข้อ จำกัด ที่ระบุว่า "ด้านล่างของ ฉลากจะอยู่ห่างจากด้านล่างของเซลล์เป็นระยะมาตรฐานเสมอ
ข้อความแสดงข้อผิดพลาดที่คุณรายงานจะเกิดขึ้นหากไม่มีข้อ จำกัด ด้านล่างซึ่งในกรณีนี้ไม่มีสิ่งใดที่จะ "ดัน" ด้านล่างของเซลล์ออกไปจากด้านบนของเซลล์ซึ่งเป็นความคลุมเครือที่รายงาน: โดยไม่มีอะไรให้ดันด้านล่างจาก ด้านบนเซลล์จะยุบลง แต่เค้าโครงอัตโนมัติตรวจพบเช่นกันและกลับไปใช้ความสูงของแถวมาตรฐาน
สำหรับสิ่งที่คุ้มค่าและส่วนใหญ่จะมีคำตอบที่โค้งมนถ้าคุณทำใช้ iOS 8 tableView:estimatedHeightForRowAtIndexPath:
ของรถยนต์เค้าโครงตามความสูงของแถวแบบไดนามิกคุณควรใช้ วิธีการประมาณนั้นสามารถใช้ค่าคร่าวๆสำหรับเซลล์ของคุณและจะถูกเรียกใช้เมื่อมีการโหลดมุมมองตารางครั้งแรก ช่วยให้ UIKit วาดสิ่งต่างๆเช่นแถบเลื่อนซึ่งไม่สามารถวาดได้เว้นแต่ Tableview จะรู้ว่าเนื้อหาสามารถเลื่อนดูได้มากแค่ไหน แต่ไม่จำเป็นต้องมีขนาดที่ถูกต้องทั้งหมดเนื่องจากเป็นเพียงแถบเลื่อน วิธีนี้ช่วยให้การคำนวณความสูงของแถวจริงสามารถเลื่อนออกไปได้จนกว่าจะถึงช่วงเวลาที่จำเป็นต้องใช้เซลล์ซึ่งใช้การคำนวณน้อยกว่าและช่วยให้การนำเสนอ UITableView ของคุณเร็วขึ้น