Có thể có được chiều cao tiêu đề của phần xem bảng động bằng cách sử dụng Bố cục Tự động không?


112

Tính năng mới trong iOS 8, bạn có thể có được 100% ô xem bảng động bằng cách chỉ cần đặt chiều cao hàng ước tính, sau đó bố trí các phần tử của bạn trong ô bằng Bố cục Tự động. Nếu nội dung tăng chiều cao, tế bào cũng sẽ tăng chiều cao. Điều này cực kỳ hữu ích và tôi đang tự hỏi liệu kỳ tích tương tự có thể được thực hiện đối với tiêu đề phần trong chế độ xem bảng không?

Chẳng hạn, một người có thể tạo một UIViewtrong tableView:viewForHeaderInSection:, thêm một UILabelchế độ xem phụ, chỉ định các ràng buộc bố cục tự động cho nhãn so với chế độ xem và để chế độ xem tăng chiều cao để phù hợp với nội dung của nhãn mà không cần phải triển khai tableView:heightForHeaderInSection:?

Tài liệu cho viewForHeaderInSectiontrạng thái: "Phương pháp này chỉ hoạt động chính xác khi tableView: heightForHeaderInSection: cũng được triển khai." Tôi chưa biết liệu có gì thay đổi cho iOS 8 hay không.

Nếu một người không thể làm điều đó, cách tốt nhất để bắt chước hành vi này là gì?

Câu trả lời:


275

Điều này là khả thi. Nó mới ngay bên cạnh chiều cao ô động được triển khai trong iOS 8.

Nó rất đơn giản. Chỉ cần thêm cái này vào viewDidLoad:

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

Sau đó, ghi đè viewForHeaderInSectionvà sử dụng Bố cục Tự động để hạn chế các phần tử trong chế độ xem của bạn sao cho phù hợp. Đó là nó! Không cần thực hiện heightForHeaderInSection. Và thực ra sectionHeaderHeightcũng không cần phải nói rõ, tôi chỉ thêm vào cho rõ ràng.

Lưu ý rằng trong iOS 11, các ô và chế độ xem đầu trang / chân trang sử dụng chiều cao ước tính theo mặc định. Điều duy nhất cần làm là cung cấp chiều cao ước tính để thông báo tốt hơn cho hệ thống những gì mong đợi. Giá trị mặc định là UITableViewAutomaticDimensionnhưng bạn nên cung cấp một ước tính tốt hơn đó là chiều cao trung bình của chúng nếu có thể.


3
Điều đó thật tuyệt nếu nó hoạt động, nhưng các tài liệu không đề cập đến nó và cả phiên WWDC cũng vậy nếu tôi nhớ chính xác. Tài liệu cho UITableViewAutomaticDimensionrằng "nếu bạn trả về hằng số này trong tableView:heightForHeaderInSection:hoặc tableView:heightForFooterInSection:, UITableViewsử dụng chiều cao phù hợp với giá trị được trả về từ tableView:titleForHeaderInSection:hoặc tableView:titleForFooterInSection:(nếu tiêu đề không phải nil)."
Aaron Brager

28
Điều này không hiệu quả với tôi. Tiêu đề phần của tôi có thể tự động tính toán chiều cao, nhưng nó chồng lên các ô trong phần. Tôi đang thiết lập chế độ xem tiêu đề của mình bằng cách sử dụng tệp xib và thiết lập các ràng buộc của tôi trong trình tạo giao diện. Đó là vấn đề của tôi? Các bạn đang tạo ra các ràng buộc ở đâu? Cảm ơn!
CoBrA2168,

5
Như đã hứa ở đây là mã mẫu: github.com/ebetabox/DynamicCellSectionHeight
PakitoV

10
Một điểm quan trọng khác ở đây, các ô trong bảng của bạn cũng cần được định cấu hình cho tính toán chiều cao tự động (UITableViewAutomaticDimension) để nó hoạt động trên các phần.
Bob Spryn

9
Bạn phải có estimatedSectionHeaderHeighthoặc tableView:estimatedHeightForHeaderInSection:sectionHeaderHeighthoặc tableView:heightForHeaderInSection:. Ngoài ra, nếu bạn đang sử dụng các phương thức ủy nhiệm, bạn phải trả về giá trị lớn hơn 1,00 cho ước tính (hành vi hoàn toàn không có tài liệu), nếu không, đại biểu cho chiều cao sẽ KHÔNG được gọi và chiều cao tiêu đề chế độ xem bảng mặc định sẽ được sử dụng.
Vadoff

29

Điều này có thể được thực hiện bằng cách đặt (hoặc trả lại) estimatedSectionHeaderHeightchế độ xem trên bảng của bạn.

Nếu tiêu đề phần của bạn chồng lên các ô sau khi thiết lậpestimatedSectionHeaderHeight , hãy đảm bảo rằng bạn cũng đang sử dụng estimatedRowHeight.

(Tôi thêm câu trả lời này vì đoạn thứ hai chứa câu trả lời cho một vấn đề có thể được tìm thấy sau khi đọc qua tất cả các nhận xét mà một số có thể bỏ sót.)


1
Cảm ơn, sau khi cài đặt estimatedRowHeightcác công trình này giống như sự quyến rũ :)
sz ashik

1
Điều này đúng ngay cả khi bạn KHÔNG sử dụng UITableViewAutomaticDimension cho các hàng. Cảm ơn vì đã tiết kiệm cho tôi một giờ.
Ryan Romanchuk

14

Bị mắc kẹt trong cùng một vấn đề trong đó tiêu đề không nhận được chiều cao cho đến khi tôi cung cấp chiều cao cố định trong đại biểu cho heighForHeaderInSection.

Đã thử rất nhiều giải pháp bao gồm

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

Nhưng không có gì hiệu quả. Tế bào của tôi cũng đang sử dụng tự động thanh toán thích hợp. Các hàng đã tự động thay đổi chiều cao của chúng bằng cách sử dụng mã sau nhưng tiêu đề phần thì không.

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

Cách khắc phục cũng cực kỳ đơn giản và kỳ lạ nhưng tôi đã phải triển khai các phương thức ủy quyền thay vì 1 mã dòng cho estimatedSectionHeaderHeightsectionHeaderHeightdiễn ra như sau đối với trường hợp của tôi.

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

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

11

Swift 4+

đang hoạt động (Đã kiểm tra 100%)

Nếu bạn cần cả hai phần cũng như hàng có chiều cao động dựa trên nội dung thì bạn có thể sử dụng mã dưới đây:

Trên viewDidLoad () viết những dòng này:

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

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

Bây giờ chúng ta đã thiết lập chiều cao hàng và chiều cao phần bằng cách sử dụng các phương thức UITableView Delegate:

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

       return UITableView.automaticDimension

   }

LƯU Ý cho câu trả lời tuyệt vời này. Kể từ năm 2020 , có vẻ như bạn CHỈ sử dụng bốn thuộc tính trong viewDidLoad.
Fattie

LƯU Ý cho câu trả lời tuyệt vời này. Kể từ năm 2020, bạn cần hai dòng "vô dụng" cho biết chiều cao ước tính (giả sử, 20 hoặc lâu hơn).
Fattie

6

Tôi đã thử

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

nhưng nó không đúng kích thước tiêu đề với nhãn nhiều dòng. Đã thêm cái này để giải quyết vấn đề của tôi:

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

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

xác định các chức năng nguồn dữ liệu tableView:estimatedHeightForHeaderInSectiontableView:heightForHeaderInSectionthay vì xác định tại viewDidLoad.
Keith Yeoh

Tôi thấy cài đặt estimatedSectionHeaderHeightchỉ cần thiết bên dưới iOS 11
doctorBroctor

1

Trong trường hợp của tôi:

  1. thiết lập theo chương trình không hoạt động .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. thiết lập trong bảng phân cảnh không hoạt động .

  2. ghi đè heightForHeaderInSection đã hoạt động .

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

thử nghiệm môi trường:

  • Mac OS 10.13.4
  • Phiên bản XCode 9.4.1
  • Trình mô phỏng iPhone 8 Plus

0

Vâng, nó hiệu quả với tôi. Tôi phải thực hiện nhiều thay đổi hơn như sau:

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

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

    return label
}

-2

Tôi đã sửa đổi câu trả lời iuriimoz . Chỉ cần thay thế phương thức viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


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

    // Recalculates height
    tableView.layoutIfNeeded() 
}

Đồng thời thêm tableView.layoutIfNeeded () vào

override func viewDidAppear(_ animated: Bool) {

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

Đối với iOS 10

tableView.beginUpdates()
tableView.endUpdates()

có hiệu ứng hoạt ảnh "mờ dần" trên viewWillAppear for me

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.