เป็นไปได้ไหมที่จะได้รับความสูงส่วนหัวของส่วนมุมมองตารางแบบไดนามิกโดยใช้เค้าโครงอัตโนมัติ


112

ใหม่ใน iOS 8 คุณสามารถรับเซลล์มุมมองตารางแบบไดนามิก 100% ได้เพียงแค่ตั้งค่าความสูงของแถวโดยประมาณจากนั้นจัดวางองค์ประกอบของคุณในเซลล์โดยใช้เค้าโครงอัตโนมัติ หากเนื้อหามีความสูงเพิ่มขึ้นเซลล์ก็จะมีความสูงเพิ่มขึ้นด้วย สิ่งนี้มีประโยชน์อย่างยิ่งและฉันสงสัยว่าจะสามารถใช้ความสามารถเดียวกันกับส่วนหัวในมุมมองตารางได้หรือไม่?

ตัวอย่างเช่นสามารถสร้างไฟล์ UIViewในtableView:viewForHeaderInSection:เพิ่มUILabelมุมมองย่อยระบุข้อ จำกัด การจัดวางอัตโนมัติสำหรับป้ายกำกับกับมุมมองและเพิ่มความสูงของมุมมองเพื่อให้พอดีกับเนื้อหาของป้ายกำกับโดยไม่ต้องใช้งานได้tableView:heightForHeaderInSection:หรือไม่

เอกสารประกอบสำหรับviewForHeaderInSectionStates: "วิธีนี้ใช้ได้เฉพาะเมื่อมีการใช้ tableView: heightForHeaderInSection: ด้วย" ฉันไม่ได้ยินว่ามีอะไรเปลี่ยนแปลงสำหรับ iOS 8 หรือไม่

หากไม่สามารถทำได้วิธีใดที่ดีที่สุดในการเลียนแบบพฤติกรรมนี้?

คำตอบ:


275

สิ่งนี้เป็นไปได้ เป็นสิ่งใหม่ควบคู่ไปกับความสูงของเซลล์แบบไดนามิกที่ใช้งานใน iOS 8

มันง่ายมาก เพียงเพิ่มสิ่งนี้ในviewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

จากนั้นแทนที่viewForHeaderInSectionและใช้การจัดวางอัตโนมัติเพื่อ จำกัด องค์ประกอบในมุมมองของคุณตามที่เห็นสมควร แค่นั้นแหละ! ไม่จำเป็นต้องใช้heightForHeaderInSectionไม่จำเป็นต้องใช้และที่จริงsectionHeaderHeightก็ไม่จำเป็นต้องระบุเช่นกันฉันเพิ่งเพิ่มเพื่อความชัดเจน

โปรดทราบว่าใน iOS 11 เซลล์และมุมมองส่วนหัว / ส่วนท้ายจะใช้ความสูงโดยประมาณตามค่าเริ่มต้น สิ่งเดียวที่ต้องทำคือระบุความสูงโดยประมาณเพื่อแจ้งให้ระบบทราบถึงสิ่งที่คาดหวังได้ดีขึ้น ค่าเริ่มต้นคือUITableViewAutomaticDimensionแต่คุณควรระบุค่าประมาณที่ดีกว่านั่นคือความสูงเฉลี่ยที่เป็นไปได้


3
มันเยี่ยมมากถ้ามันใช้งานได้ แต่เอกสารไม่ได้พูดถึงมันและเซสชัน WWDC ก็ไม่ได้ทำเช่นกันถ้าฉันจำได้ถูกต้อง เอกสารสำหรับUITableViewAutomaticDimensionพูดว่า "if you return this constant in tableView:heightForHeaderInSection:or tableView:heightForFooterInSection:, UITableViewuse a height that fit the value return from tableView:titleForHeaderInSection:or tableView:titleForFooterInSection:(if the title is not nil).
Aaron Brager

28
สิ่งนี้ไม่ได้ผลสำหรับฉัน ส่วนหัวของฉันสามารถคำนวณความสูงโดยอัตโนมัติ แต่มันทับซ้อนกับเซลล์ในส่วน ฉันกำลังตั้งค่ามุมมองส่วนหัวโดยใช้ไฟล์ xib และตั้งค่าข้อ จำกัด ในตัวสร้างอินเทอร์เฟซ นั่นคือปัญหาของฉันหรือเปล่า? พวกคุณสร้างข้อ จำกัด ตรงไหน? ขอบคุณ!
CoBrA2168

5
ตามที่สัญญาไว้นี่คือโค้ดตัวอย่าง: github.com/ebetabox/DynamicCellSectionHeight
PakitoV

10
ประเด็นสำคัญอีกประการที่นี่เซลล์ตารางของคุณจะต้องได้รับการกำหนดค่าสำหรับการคำนวณความสูงอัตโนมัติ (UITableViewAutomaticDimension) เพื่อให้สามารถทำงานในส่วนต่างๆได้
Bob Spryn

9
คุณต้องมีestimatedSectionHeaderHeightหรือtableView:estimatedHeightForHeaderInSection:และหรือsectionHeaderHeight tableView:heightForHeaderInSection:นอกจากนี้หากคุณกำลังใช้วิธีการมอบหมายคุณต้องส่งคืนค่าที่มากกว่า 1.00 สำหรับค่าประมาณ (พฤติกรรมที่ไม่มีเอกสารทั้งหมด) มิฉะนั้นจะไม่เรียกผู้รับมอบสิทธิ์สำหรับความสูงและจะใช้ความสูงส่วนหัวของมุมมองตารางเริ่มต้น
Vadoff

29

สิ่งนี้สามารถทำได้โดยการตั้งค่า (หรือคืนค่า) estimatedSectionHeaderHeightมุมมองตารางของคุณ

หากส่วนหัวของคุณซ้อนทับเซลล์ของคุณหลังจากการตั้งค่าestimatedSectionHeaderHeightตรวจสอบให้แน่ใจว่าคุณกำลังใช้ไฟล์estimatedRowHeightเช่นกัน

(ฉันกำลังเพิ่มคำตอบนี้เนื่องจากย่อหน้าที่สองมีคำตอบสำหรับปัญหาที่สามารถพบได้หลังจากอ่านความคิดเห็นทั้งหมดซึ่งบางคนอาจพลาดไป)


1
ขอบคุณหลังจากการตั้งค่าestimatedRowHeightนี้ใช้งานได้อย่างมีเสน่ห์ :)
sz ashik

1
ซึ่งเป็นจริงแม้ว่าคุณจะไม่ได้ใช้ UITableViewAutomaticDimension สำหรับแถวก็ตาม ขอบคุณที่ช่วยฉันหนึ่งชั่วโมง
Ryan Romanchuk

14

ติดอยู่ในปัญหาเดียวกันที่ส่วนหัวมีความสูงเป็นศูนย์จนถึงปัจจุบันและเว้นแต่ฉันจะระบุความสูงคงที่ในผู้รับมอบสิทธิ์สำหรับ heighForHeaderInSectionได้ติดอยู่ในปัญหาเดียวกันที่ส่วนหัวได้รับเป็นศูนย์ความสูงจนและถ้าผมให้ความสูงคงที่ในผู้รับมอบสิทธิ์สำหรับ

พยายามแก้ปัญหามากมายซึ่งรวมถึง

self.tableView.sectionHeaderHeight = UITableView.automaticDimension
self.tableView.estimatedSectionHeaderHeight = 73

แต่ไม่มีอะไรทำงาน เซลล์ของฉันใช้การจัดวางอัตโนมัติที่เหมาะสมด้วย แถวกำลังเปลี่ยนความสูงแบบไดนามิกโดยใช้รหัสต่อไปนี้ แต่ส่วนหัวของส่วนไม่ใช่

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableView.automaticDimension

การแก้ไขนั้นง่ายมากและแปลกด้วย แต่ฉันต้องใช้วิธีการมอบหมายแทนรหัส 1 บรรทัดสำหรับestimatedSectionHeaderHeightและsectionHeaderHeightสิ่งที่จะเป็นดังนี้สำหรับกรณีของฉัน

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    73
}

11

Swift 4+

ทำงาน (ผ่านการทดสอบ 100%)

หากคุณต้องการทั้งสองส่วนและแถวที่มีความสูงแบบไดนามิกตามเนื้อหาคุณสามารถใช้โค้ดด้านล่าง:

บน viewDidLoad () เขียนบรรทัดนี้:

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

ตอนนี้เราได้ตั้งค่าความสูงของแถวและความสูงของส่วนโดยใช้วิธีการ UITableView Delegate:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }

หมายเหตุสำหรับคำตอบที่ดีนี้ ในปี 2020ดูเหมือนว่าจะใช้ได้เฉพาะสี่คุณสมบัติใน viewDidLoad
Fattie

หมายเหตุสำหรับคำตอบที่ดีนี้ ในปี 2020คุณจำเป็นต้องมีเส้น "ไร้ประโยชน์" สองเส้นที่ให้ความสูงโดยประมาณ (เช่น 20 หรือมากกว่านั้น)
Fattie

7

ฉันเหนื่อย

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

แต่ไม่ได้กำหนดขนาดส่วนหัวที่มีป้ายกำกับหลายบรรทัดอย่างถูกต้อง เพิ่มสิ่งนี้เพื่อแก้ปัญหาของฉัน:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}

กำหนดฟังก์ชันแหล่งข้อมูลtableView:estimatedHeightForHeaderInSectionและtableView:heightForHeaderInSectionแทนที่จะกำหนดที่ viewDidLoad
Keith Yeoh

ฉันพบว่าการตั้งค่าestimatedSectionHeaderHeightจำเป็นเฉพาะด้านล่าง iOS 11
doctorBroctor

1

ในกรณีของฉัน:

  1. ตั้งโปรแกรมไม่ทำงาน

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. ตั้งอยู่ในสตอรี่บอร์ดไม่ทำงาน

  2. แทนที่ทำงานheightForHeaderInSection

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

ทดสอบสภาพแวดล้อม:

  • Mac OS 10.13.4
  • XCode เวอร์ชัน 9.4.1
  • จำลอง iPhone 8 Plus

0

ใช่มันได้ผลสำหรับฉัน ฉันต้องทำการเปลี่ยนแปลงเพิ่มเติมดังนี้:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}

-2

ผมปรับเปลี่ยนiuriimoz คำตอบ เพิ่งเปลี่ยนเมธอด viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

เพิ่ม tableView.layoutIfNeeded () ไปยัง

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

สำหรับ iOS 10

tableView.beginUpdates()
tableView.endUpdates()

มีเอฟเฟกต์ภาพเคลื่อนไหว "จาง" ใน viewWillAppear ให้ฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.