Otomatik Yerleşim kullanarak dinamik bir tablo görünümü bölüm başlığı yüksekliği elde etmek mümkün müdür?


112

İOS 8'de bir yenilik olarak, yalnızca tahmini satır yüksekliğini ayarlayarak% 100 dinamik tablo görünümü hücreleri elde edebilir, ardından öğelerinizi Otomatik Yerleşim kullanarak hücrede düzenleyebilirsiniz. İçeriğin yüksekliği artarsa, hücrenin yüksekliği de artacaktır. Bu son derece kullanışlıdır ve bir tablo görünümünde bölüm başlıkları için aynı başarıya ulaşılıp ulaşılamayacağını merak ediyorum.

Bir, örneğin, bir oluşturabilir UIViewiçinde tableView:viewForHeaderInSection:bir ekleme, UILabeluygulamaya gerek kalmadan, subview belirtmek otomatik düzen kısıtlamaları görünümünde karşı etiket için ve etiketin içeriğini uyacak şekilde yüksekliği görünüm artış var tableView:heightForHeaderInSection:?

viewForHeaderInSectionDurumlar için dokümantasyon : "Bu yöntem yalnızca tableView: heightForHeaderInSection: da uygulandığında doğru şekilde çalışır." İOS 8 için herhangi bir değişiklik olup olmadığını duymadım.

Bunu yapamıyorsanız, bu davranışı taklit etmenin en iyi yolu nedir?

Yanıtlar:


275

Bu mümkün. İOS 8'de uygulanan dinamik hücre yüksekliklerinin yanı sıra yeni.

Çok basit. Sadece şunu ekleyin viewDidLoad:

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

Ardından viewForHeaderInSection, görünümünüzdeki öğeleri uygun görüldüğü şekilde kısıtlamak için Otomatik Yerleşimi geçersiz kılın ve kullanın. Bu kadar! Uygulamaya gerek yok heightForHeaderInSection. Ve aslındasectionHeaderHeight bunun da belirtilmesine gerek yok, sadece açıklık için ekledim.

İOS 11'de hücrelerin ve üstbilgi / altbilgi görünümlerinin varsayılan olarak tahmini yükseklikleri kullandığını unutmayın. Yapılması gereken tek şey, sisteme ne bekleyeceğini daha iyi bilgilendirmek için tahmini bir yükseklik sağlamaktır. Varsayılan değer, UITableViewAutomaticDimensionancak daha iyi bir tahminde bulunmalısınız, bu, mümkünse ortalama yüksekliktir.


3
İşe yararsa sorun değil, ancak dokümanlar bundan bahsetmiyor ve doğru hatırlıyorsam WWDC oturumu da söylemedi. İçin dokümanlar UITableViewAutomaticDimensionsöz hakkından "Eğer bu sabit dönerseniz tableView:heightForHeaderInSection:ya tableView:heightForFooterInSection:, UITableViewdönen değer uyan bir yüksekliğe kullanan tableView:titleForHeaderInSection:veya tableView:titleForFooterInSection:(başlık değilse nil)."
Aaron Brager

28
Bu benim için işe yaramadı. Bölüm başlığım yüksekliği otomatik olarak hesaplayabildi, ancak bölümdeki hücrelerle örtüşüyor. Başlık görünümümü bir xib dosyası kullanarak ve arayüz oluşturucudaki kısıtlamalarımı ayarlıyorum. Benim sorunum bu mu? Kısıtlamaları nerede yaratıyorsunuz? Teşekkürler!
CoBrA2168

5
Burada söz verdiğimiz gibi örnek kod: github.com/ebetabox/DynamicCellSectionHeight
PakitoV

10
Buradaki diğer bir önemli nokta, tablo hücrelerinizin bölümler üzerinde çalışması için otomatik yükseklik (UITableViewAutomaticDimension) hesaplaması için yapılandırılması gerekir.
Bob Spryn

9
estimatedSectionHeaderHeightVeya tableView:estimatedHeightForHeaderInSection:VE sectionHeaderHeightveya olmalıdır tableView:heightForHeaderInSection:. Ek olarak, temsilci yöntemlerini kullanıyorsanız, tahmin için 1,00'den büyük bir değer döndürmelisiniz (tamamen belgelenmemiş davranış), aksi takdirde yükseklik için temsilci ÇAĞIRILMAZ ve varsayılan tablo görünümü üstbilgi yüksekliği kullanılır.
Vadoff

29

Bu, estimatedSectionHeaderHeighttablo görünümünüzde ayarlayarak (veya geri dönerek) gerçekleştirilebilir .

Bölüm başlığınız ayarlandıktan sonra hücrelerinizle örtüşüyorsa,estimatedSectionHeaderHeight bir de kullandığınızdan emin olun estimatedRowHeight.

(Bu yanıtı ekliyorum çünkü ikinci paragraf, bazılarının gözden kaçırabileceği tüm yorumları okuduktan sonra bulunabilecek bir sorunun cevabını içeriyor.)


1
Teşekkürler, ayarladıktan sonra estimatedRowHeightbu çekicilik gibi çalışır :)
sz ashik

1
Bu, satırlar için UITableViewAutomaticDimension kullanmasanız bile geçerlidir. Beni bir saat kurtardığın için teşekkürler.
Ryan Romanchuk

14

Başlığın sıfır yüksekliğe ulaştığı aynı soruna takılı kaldım ve delegede sabit bir yükseklik sağlamadığım sürece heighForHeaderInSection .

Aşağıdakileri içeren birçok çözüm denedim

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

Ama hiçbir şey işe yaramadı. Hücrem de uygun otomatik düzenleri kullanıyordu. Satırların yüksekliği aşağıdaki kodu kullanarak dinamik olarak değiştiriliyordu ancak bölüm başlığı değişmedi.

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

Düzeltme de son derece basit ve garip ama benim durumum için aşağıdaki gibi giden estimatedSectionHeaderHeightve için 1 satır kodu yerine delege yöntemlerini uygulamak zorunda kaldım sectionHeaderHeight.

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

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

11

Swift 4+

çalışıyor (% 100 test edildi)

Hem bölüme hem de içeriğe göre dinamik yüksekliğe sahip satıra ihtiyacınız varsa, aşağıdaki kodu kullanabilirsiniz:

ViewDidLoad () üzerine şu satırları yazın:

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

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

Şimdi UITableView Delegate yöntemlerini kullanarak satır yüksekliğini ve bölüm yüksekliğini ayarladık:

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

       return UITableView.automaticDimension

   }

NOT bu büyük cevaba. 2020 itibariyle, viewDidLoad'da YALNIZCA dört özelliğin kullanılması uygun görünmektedir.
Şişko

NOT bu büyük cevaba. 2020 itibariyle, tahmini bir yükseklik (örneğin, 20 veya daha fazla) veren iki "yararsız" çizgiye ihtiyacınız var.
Şişko

6

denedim

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

ancak çok satırlı etiketli başlığı doğru boyutlandırmadı. Sorunumu çözmek için bunu ekledim:

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

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

Veri kaynağı fonksiyonları tanımlarım tableView:estimatedHeightForHeaderInSectionve tableView:heightForHeaderInSectionbunun yerine viewDidLoad de tanımlanması.
Keith Yeoh

Ayarın estimatedSectionHeaderHeightyalnızca iOS 11'in altında gerekli olduğunu buldum
doctorBroctor

1

Benim durumumda:

  1. programlı olarak çalışmıyor .

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. film şeridinde ayarla çalışmıyor .

  2. geçersiz kılma heightForHeaderInSection çalıştı .

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

test ortamı:

  • Mac OS 10.13.4
  • XCode Sürüm 9.4.1
  • Simülatörü iPhone 8 Plus

0

Evet, benim için çalışıyor. Aşağıdaki gibi daha fazla değişiklik yapmam gerekiyor:

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

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

    return label
}

-2

İuriimoz cevabını değiştirdim . ViewWillAppear yöntemi yeni değiştirildi:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


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

    // Recalculates height
    tableView.layoutIfNeeded() 
}

Ayrıca tableView.layoutIfNeeded () öğesini ekleyin.

override func viewDidAppear(_ animated: Bool) {

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

İOS 10 için

tableView.beginUpdates()
tableView.endUpdates()

görünümde "solma" animasyon efekti var

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.