İOS8'in Tablo Görünümlerinde harika bir yeni özelliğin yan etkisiyle karşılaşıyorsunuz: Otomatik Satır Yükseklikleri.
İOS 7'de, ya sabit boyutta satırlarınız vardı (ile ayarlanmış tableView.rowHeight
) ya da hücrelerinizin yüksekliğini hesaplamak için kod yazarsınız ve bunu geri verirsiniz tableView:heightForRowAtIndexPath
. Bir hücrenin yüksekliğinin hesaplanması için kod yazmak, hücrenizde çok sayıda görünümünüz varsa ve farklı yazı tipi boyutlarında göz önünde bulundurmanız gereken farklı yükseklikleriniz varsa oldukça karmaşık olabilir. Dinamik Tip'i ekleyin ve süreç tam bir acı oldu.
İOS 8'de, yukarıdakileri yine de yapabilirsiniz, ancak hücrenizin içeriğini Otomatik Düzen kullanarak yapılandırdıysanız, şimdi satırların yüksekliği iOS tarafından belirlenebilir. Bu, geliştiriciler için büyük bir avantajdır, çünkü dinamik yazı tipi boyutu değiştikçe veya kullanıcı Erişilebilirlik Ayarlarını kullanarak metin boyutunu değiştirdikçe, kullanıcı arayüzünüz yeni boyuta uyarlanabilir. Aynı zamanda, birden fazla metin satırına sahip olabilen bir UILabel'iniz varsa, hücrenizin ihtiyaç duyduğu zamanlara uyacak şekilde büyüyebileceği ve ihtiyaç duymadığında küçülebileceği anlamına gelir, böylece gereksiz boşluk kalmaz.
Gördüğünüz uyarı mesajı, hücrenizde Otomatik Düzen için hücrenin yüksekliğiyle ilgili tablo görünümünü bilgilendirmek için yeterli kısıtlama olmadığını söylüyor.
Diğer posterler tarafından daha önce bahsedilen tekniklerle birlikte bu mesajdan da kurtulacak olan dinamik hücre yüksekliğini kullanmak için, hücrenizin UI öğelerini hücrenin üstüne ve altına bağlamak için yeterli kısıtlamalara sahip olduğundan emin olmanız gerekir . Otomatik Yerleşimi daha önce kullandıysanız, muhtemelen Üst + Satır Aralığı sınırlamalarını ayarlamaya alışkınsınızdır, ancak dinamik satır yüksekliği de alt sınırlamaları gerektirir.
Düzen geçişi, bir hücre ekranda tam zamanında görüntülenmeden hemen önce şu şekilde çalışır:
İç boyutlara sahip içeriğin boyutları hesaplanır. Bu, boyutlarının sırasıyla içerdikleri metne veya UIGörsellere dayalı olduğu UILabels ve UIImageViews içerir. Bu görünümlerin her ikisi de genişliklerinin bilinen olduğunu kabul eder (çünkü arka / ön kenarlar için sınırlamalar ayarladınız veya açık genişlikler ayarladınız veya sonunda bir yandan diğerine bir genişliği ortaya çıkaran yatay sınırlamalar kullandınız). Bir etikette bir paragraf metni olduğunu varsayalım ("satır sayısı" 0 olarak ayarlanmıştır, böylece otomatik olarak kaydırılır), yalnızca 310 punto olabilir, bu nedenle mevcut yazı tipi boyutunda 120pt yüksekliğinde olduğu belirlenir.
UI, konumlandırma kısıtlamalarınıza göre düzenlenir. Etiketin altında hücrenin alt kenar boşluğuna bağlanan bir kısıtlama var. Etiket 120 nokta yüksekliğinde büyüdüğünden ve kısıtlamayla hücrenin altına bağlandığından, "altta" yazan kısıtlamayı karşılamak için hücreyi "aşağı" (hücrenin yüksekliğini artırarak) itmesi gerekir. etiket her zaman hücrenin altından standart mesafedir.
Bildirdiğiniz hata mesajı, bu alt sınırlama eksikse oluşur; bu durumda hücrenin altını hücrenin üstünden uzağa "itecek" hiçbir şey yoktur, bu da bildirilen belirsizliktir: üstte hücre çöker. Ancak Otomatik Düzen bunu da algılar ve standart satır yüksekliğini kullanmaya geri döner.
Değeri ne olursa olsun ve çoğunlukla yuvarlak bir cevaba sahip olmak için, iOS 8'in Otomatik Düzen tabanlı dinamik satır yüksekliklerini uygularsanız, uygulamalısınız tableView:estimatedHeightForRowAtIndexPath:
. Bu tahmin yöntemi, hücreleriniz için kaba değerler kullanabilir ve tablo görünümü ilk yüklendiğinde çağrılır. UIKit'in kaydırma çubuğu gibi şeyleri çizmesine yardımcı olur; bu, tablo görünümü içeriğin ne kadar kaydırılabileceğini bilmediği sürece çizilemez, ancak sadece bir kaydırma çubuğu olduğu için tamamen doğru boyutlara ihtiyaç duymaz. Bu, gerçek satır yüksekliğinin hesaplanmasının, hücreye ihtiyaç duyulan ana kadar ertelenmesini sağlar; bu, hesaplama açısından daha az yoğun ve UITableView'unuzun daha hızlı sunulmasını sağlar.