2009-09-21 19 views
5

Tablo görünümü hücrelerimi, UITableViewDelegate yerine hücrenin içinden yeniden boyutlandırmak istiyorum. Eşzamansız içeriğe göre onları yeniden boyutlandırıyorum, bu yüzden onları temsilci olarak boyutlandıramıyorum.UITableViewDelegate kullanmadan UITableViewCell yeniden boyutlandırılabilir mi?

Hücrenin içine self.frame ayarlamayı denedim, ancak tablo görünümü bu konuda gerçekten mutsuzdu. Hücreler örtüşüyordu ve her türlü çılgınlık devam ediyordu.

cevap

5

Sadece yüksekliğini kontrol etmek için tablo görünümünü kullanmak zorunda. Bir hücreyi, belirli hücreleri kaldırmak ve daha sonra yeniden eklemek için çağrıları kullanarak değiştirilmiş bir tablo söyleyebilir, bu nedenle tüm tabloyu yeniden yüklemek zorunda değilsiniz - ancak temsil temsilci deyimi kullanılarak yüksekliği getirilmesi gerekir: heightForRow: atIndexPath:

Bunun neden pratik olmadığını anlamıyorum. Tablo görüntüleme temsilcisi tarafından tutulan bir merkezi yükseklik önbelleğini güncelleyen herhangi bir sayıda asynch sistemi olabilir. - her hücre oluşturduğunuzda, bir temsilci olarak referans olarak atayabilirsiniz, böylece tabloya geri dönmenin bir yolu vardır. Hücrelerin yeniden yüklenmesi gerektiğini ve yeni yüksekliklerin ne olduğunu biliyor.

Bunu düşünürseniz, zayıf tablo görünümü, tüm bu ayrı hücreleri yönetmek ve bunları görsel olarak bir arada tutmak zorunda olan bir kaydırma görünümüdür. Bu nedenle, bir hücrenin gerçekten haksız yere gitmesi ve tabloyu çıkarmadan çerçeveleri değiştirmeye başlamak görmek neyse ne olduğunu biliyor. Masanın sürmesine ve ne yapacağını söylemesine izin vermek en iyisidir.

+0

Evet, [tableView reloadData] öğesini çağırırsanız, o tabloya göre uygun hücre yüksekliklerini hesaplama şansınız olan tableView: heightForRow: atIndexPath: 'delege yöntemini çağırır. Ancak aklınızda bulundurun ki, çok uzun hücreleriniz varsa veya bunların çoğuna sahipseniz, bu, kaydırma performansı açısından pahalı olabilir. – runmad

+0

Yükseklik önbellek bölümünün gerçekten önemli olmasının nedeni budur, bu nedenle sisteme yüksekliklerin ne olduğunu söylemek için çok fazla çalışma yapmanız gerekmez. –

+1

Canada Dev'in önerdiği gibi [tableView reloadData] aramanız gerekmez. Daha ziyade, [tableView beginUpdates] 'i arayabilirsiniz; [tableView endUpdates]; Bu, her bir hücreyi yeniden yüklemeden her bir hücreyi (her bir hücre için) heightForForRow: atIndexPath çağrısı) yeniden ölçmesine neden olur. – TomSwift

0

Sen hücreleri kendisi çerçeve heres bir referans yerine, hücreleri contentView propertys çerçeveyi yönetmek için çalışmalısınız http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/contentView

+0

İçerikView'de görünümler ekliyorum. ContentView otomatik olarak autoResizingMask ile yeniden boyutlandırıldığı için 'self.contentView.frame' yerine' self.frame' yeniden boyutlandırıyorum. Her iki durumda da 'self.view' veya 'self.contentView' çerçevesinin ayarlanması sorunu çözmez. TableView, hücrenin içinden boyutlandırırsanız hala şaşırır. –

1

Hayır, hücrenin boyutunu UITableViewDelegate kullanmadan ayarlayamazsınız. Hücrenin büyüklüğünü değiştirmek, hücrenin boyutunu gerçekten değiştirir, ancak UITableView'un hücreleri çekeceği ofsetleri değiştirmez. Hangi örtüşmelerle sonuçlanacak ve her yerde boşluklar olacak.

Arkadaşınız tableView:heightForRowAtIndexPath: ve hızlı olmalıdır. Bunu geçersiz kılarsanız, tablo görünümü artık tüm satırların aynı yükseklikte olduğu varsayımı yapamaz. Bu nedenle, çizilecek hücreleri her aldığında yüksekliği için tüm satırlarını sorgulamaları gerekir.

İlgili konular