Kısıtlamaların belirsiz bir şekilde sıfır yükseklik önerdiği bir durum tespit edildi


120

Tablo görünümü hücrelerini içeren uygulamamı çalıştırdığımda Xcode 6.1 beta 2'ye güncelledikten sonra hata ayıklama asistanı şunu söylüyor:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Daha önce, bu projede Xcode 5'i kullandığımda, birkaç hata alıyordum ama bunlar, yükseltmeden bu yana kayboldu. Şu anda başka hata veya uyarım yok. Zaten tüm tablo görünüm hücrelerinin boyutlarını ayarlamayı denedim ve ayrıca standart yüksekliği kullanmayı denedim, ancak yine de aynı uyarıyı alıyorum:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Bununla ilgili tüm benzer konuları da okudum, ancak çözümlerinin hiçbiri yardımcı olmuyor. Uygulamayı simülatör ile test ettiğimde, uygulama tableView hücrelerinde olması gereken resimler dışında iyi çalışıyor.


2
Koleksiyon görüntüleme hücresi için aynı hatayı alıyorum. Bunun için ne yapıyorum. Baska öneri.
python

Belki de xib dosyasını hedef stackoverflow.com/a/26870331/1418457
onmyway133

1
olası iOS8
Max MacLeod

Bu bana iOS 8.1'de oldu, ancak artık iOS 8.4'te değil. Yüksekliği belirttiyseniz, bu sadece bir Xcode hatasıdır.
samwize

Yanıtlar:


126

Şimdiye kadar üç şey bu uyarıyı susturmayı başardı. Sizin için en uygun olanı alabilirsiniz. Yine de güzel bir şey yok.

  • ViewDidLoad'da varsayılan hücrenin yüksekliğini ayarlamak için

    self.tableView.rowHeight = 44;
  • Film şeridine gidin ve masa görünümünüzdeki satır yüksekliğini 44'ten farklı bir şeye değiştirin.

  • Tableview's temsilci yöntemini uygulamak için heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

Tuhaf.


Yönteminizi de kullanmayı denedim, ancak rowHeight için bir @ özelliği eklemem gerekiyor, ancak kullanılacak doğru nesne türünü bilmiyorum
David E

Notunuzu almamış olabilirim ama rowHeight bir UITableView özelliğidir. Masanızı bir prize bağlamanız yeterli, hepsi bu.
Viktor Kucera

4
Bunun nedeni, 44pt değerini IB'de tutarsanız, kendi kendini boyutlandıran hücreleri kullanmak istediğinizi düşünecek olmasıdır. stackoverflow.com/questions/25888126/… (ama evet, bu gerçekten tuhaf bir davranış)
Guillaume Algis

Görünüşe göre iki viewDidLoad yöntemim vardı self.tableView.rowHeight = 44;ve yanlış olanı koydum . Hata ortadan kalktı! teşekkürler
David E

Bunu daha net hale getirdiği için Guillaume Algis'e teşekkürler. Yine de çok ürkütücü.
Viktor Kucera

216

İ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:

  1. İç 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.

  2. 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.


3
Bu, bu uyarının temel nedeninin harika bir açıklamasıdır. Zaman ayırdığın için çok teşekkürler, Woodster!
Golden Thumb

4
Woodster'ın söylediği gibi, kısıtlamaların alt kısmını özledim. Eklendiğinde sorunum çözüldü.
Golden Thumb

Neredeyse 20 şeyi denedikten sonra, işe yarayan tek şey bu!
Julio Rodrigues

Bu adam başardı! O hak ediyor ve oy veriyor ve bu kabul edilen cevap olmalı. +1
karayipler

1
Hangi hücrede kısıtlamaların eksik olduğunu bulmak için bu cevaba stackoverflow.com/a/29565073/4080860 bakın .
hhanesand

11

Bu sorunu bir özel oluşturduktan UITableViewCellve alt görünümlerimi onun yerine hücreye ekledikten sonra yaşadım contentView.


10

Bunu programlı bir yöntem olmadan çözmek için, film şeridinden Boyut Denetçisi'ndeki tablo görünümünün satır yüksekliğini ayarlayın.

görüntü açıklamasını buraya girin


Benim için en iyi çözüm, çünkü kod satırları yerine film şeridi malzemelerini kullanmak.
zyc

6

Bu bir otomatik düzen sorunudur. Alt görünümlerinizin tüm kısıtlamalara sahip olduğundan emin olun. Benim için, hücredeki Başlık Etiketi için alt sınırlama eksikti. Bunu eklediğimde uyarı gitti ve her şey mükemmel bir şekilde ortaya çıktı.


Mükemmel bir cevap olduğu için bunun neden olumsuz oy verildiğini bilmiyorum. Hangi hücrenin yerleştirilmesinde sorun yaşadığını bulma konusunda yardım için buraya bakın stackoverflow.com/a/29565073/4080860
hhanesand

5

Sadece Kendinden Boyutlandırmalı Tablo Görünüm Hücrelerini etkinleştirin

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& Emin her tarafında kısıtlamalar eklendi yapmak UITableViewCellAS-

görüntü açıklamasını buraya girin


Aslında, self-sizeig tableview hücrelerini devre dışı bıraktığımda uyarı ortadan kalktı.
2018,

@turingtested, çeşitli cihazlarda destek vermek için kendiliğinden boyutlandırılan tablo görünümü hücresini etkinleştirmelisiniz.
Jack

Kabul ediyorum, ancak lütfen orijinal soruyu okuyun. Demek istediğim, önerilen çözümünüzün işe yaramamasıydı, en azından benim için değil.
turing

BilginizeUITableViewAutomaticDimensionUITableView.automaticDimension
atineoSE

5

Statik hücre veya dinamik hücre kullanıyorsanız, denetleyici tablosundaki tablo görünümüne biraz satır yüksekliği ekleyin ve satır yüksekliğinin sağ tarafındaki otomatik seçeneğin işaretini kaldırın, işte bu uyarıyı almayı bırakacaksınız.görüntü açıklamasını buraya girin


Bunun tersini daha etkili buldum: açık bir tahmini yükseklik ayarlayın ve satır yüksekliğinin otomatik olmasına izin verin.
NRitH

4

Bugün bu uyarıyı aldım. İşte benim için ortadan kaybolan şey (arayüz oluşturucuda)

1. Tablo görünümü için satır yüksekliği alanını 44 dışında bir değere ayarlayın 2 tableView hücresi için satır yüksekliği alanını 44 dışında bir değere ayarlayın

Kodda herhangi bir değişiklik yapmam gerekmedi


3

Benim durumumda, hücreyi programlı olarak oluşturuyordum ve bu hatayı almaya devam ettim.

Ben de subviews ve sınırlamalar ekleyerek edildi UITableViewCellbireyin initböyle yöntemle:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Sorunu hücrenin contentViewyerine ekleyerek çözdüm:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
Alt görünümleri her zaman doğrudan contentViewdeğil, öğesine ekleyin UITableViewCell.
dinesharjani

3

Tahmini satır yüksekliğini sıfıra ayarlayın ve uyarı kaybolur:

görüntü açıklamasını buraya girin


Asıl sorun, bir yerlerde eksik bir kısıtlamadır. Muhtemelen üst / alt sınırlamaları ayarlamak yerine dikey olarak bir şey giriyorsunuz
TruMan1

1

Xcode 6 GM'ye geçerken ben de bu uyarıyı yaşadım. Uyarıyı sadece cihazı orijinal konumuna döndürdüğümde alıyordum.

Özel UITableViewCells kullanıyorum. Film şeridi tablo görünümü özel boyutuma ayarlandı (benim durumumda 100.0). Tablo hücreleri önceki sürümlerde olduğu gibi düzgün bir şekilde işlenirken, uyarı mesajını beğenmedim.

Yukarıdaki fikirlere ek olarak bunu ekledim

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

Ekran işler ... dönüşe yanıt verir ve artık uyarı mesajı vermez.


Bu yüzden bana verdiğiniz satırı kullanarak yönteminizi kullanmayı denedim ama yine de aynı hatayı buluyorum. Ayrıca uygulamamda rotasyonu kullanmıyorum.
David E

1

Xcode 6.0.1'de satır yüksekliğini belirterek şu uyarıları kaldırdım:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

TableView için bir Özel tableViewCell oluşturduysanız, hücrelere hem alt hem de üst sınırlamalar verdiğinizden emin olun, özel hücrelerdeki alt görünümleriniz herhangi bir hata mesajı vermeyen ancak karışıklık yaratan Y merkezde hizalıysa da bu mesajı alabilirsiniz. sırayla tablo görünümü için satır yüksekliğini belirleyerek gibi , burada hem üst hem de alt kısıtlamalarımız var

TableView için bir Özel Hücre oluşturduğunuzda, hücre içindeki özel hücrenin alt görünümleri için belirli satır yüksekliğine veya üst ve alt kısıtlamalara ihtiyacınız vardır (örneğin, aşağıdaki resimde olduğu gibi özel hücredeki etiket)

Ancak bu işe yaramazsa, otomatik olmak yerine hücreniz için satır yüksekliğini ayarlamayı deneyebilirsiniz. , bu görseldeki gibi

Ancak, bu otomatik işareti kapatırsanız, otomatik olarak yapılabilecek değişiklikler için programlı olarak satır boyutunu ayarlamanız gerektiğinden emin olun.


0

Film şeridi olarak belirlenen cell Row heightile aynı değere sahip bir alan Row heightiçindetableView (benim için çalıştı aynı değere sahip her ikisi).

Kodunuza heightForRowAtIndexPathişlev eklerseniz , performans sorununa neden olabilir çünkü her hücre için çağrılacaktır, bu nedenle dikkatli olun.


0

Bu mesajı, tek kısıtlamalarınız tüm öğeleri dikey olarak hizalamak için ayarlanmışsa ve hücre için belirlenmiş bir yüksekliğe sahip değilseniz / istemiyorsanız da görebilirsiniz. Öğe için bir üst / alt sınırlama ayarlarsanız, uyarı kaybolur.


0

Özel tableViewCell'deki etiketlerim ve görünümlerim Content View ile değil, customCell ile sınırlandırıldığında bu sorunu yaşadım. Kısıtlamaları kaldırıp bunları hücrelere bağladığımda İçerik Görünümü sorunu çözüldü.


0

Aynı hata mesajını aldım, tüm çıkışlarınızın tablo görünümü ve tablo görünümü Kısıtlamaları gibi geçerli olduğundan emin olun


0

Dinamik yükseklik hesabı yapıyorsanız,

  • üst ve alt gibi kısıtlamalar açısından tüm unsurları birbirine bağlamalısınız.
  • kesinlikle hücrenizin altındaki öğeye bağlı bir alt sınırlamanız olmalıdır

0

Dinamik satır yüksekliğine sahip özel tablo görünümü hücresi için de benzer bir sorunum var. Dinamik yükseklik yansıtılmadı ve konsolda aynı uyarıyı aldı. Çözüm, contentView yerine hücreye alt görünümler eklemektir. BTW, programatik olarak alt görünümler oluşturdum.


0

Bu sorunu, TableViewCellbaşlatmada kısıtlamaların ayarlandığı, ancak hücrenin içeriğinin daha sonra yüklendiği yerlerde, bu, otomatik düzen motorunun yüksekliği belirleyemediği anlamına gelir. Buradaki diğer çözümler işe yaramıyor çünkü hücrenin yüksekliğine ihtiyacım varUITableView.automaticDimension .

Hücreye az önce fazladan bir kısıtlama ekledim:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

Bugün bu Uyarıyı aldım Tek yaptığım koduma fazladan bir satır eklemek

tableView.rowHeight = 200;

bu kod satırını

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

ve son kod şöyle görünür

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

bu kod, tablonun Satır hücre yüksekliğini 200'e çıkarır, varsayılan yükseklik 44'tür


-1

Aynı hatayı alıyorum, bu satırdan dolayı bu hata gösterildi.

self.layer.backgroundColor = UIColor (beyaz: 1, alfa: 0.2) olarak! CGColor

Hatayı düzeltmek için satırı aşağıdaki gibi değiştiriyorum

self.layer.backgroundColor = UIColor (beyaz: 1, alfa: 0.2) .cgColor

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.