iOS8 - kısıtlamalar belirsiz bir şekilde sıfır yüksekliğini gösteriyor


100

Bunun nasıl hata ayıklanacağı hakkında bir fikri olan var mı?

Yalnızca bir kez uyarı: Bir tablo görünümü hücresinin içerik görünümü için kısıtlamaların belirsiz bir şekilde sıfır yüksekliğini önerdiği bir durum algılandı. İstemeden çökmeyi düşünüyoruz ve bunun yerine standart yüksekliği kullanıyoruz.

Satırların sabit bir yüksekliği vardır.

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

Ve hepsi constraintsmutlu görünüyor ...

Yanıtlar:


129

Dönüş yüksekliğini ve tahmini yüksekliği zorlamak benim durumumda uyarının ortadan kalkmasına neden oldu.

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

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

İki geçersiz kılmaya ihtiyaç duymadığınız başka bir çözüm, basitçe self.tableView.rowHeight = 44;sizin loadViewveya init yönteminizde kullanmaktır.


1
Bölümde birden çok tür satırım var ve bunlardan yalnızca biri dinamik yüksekliğe sahip. o zaman çalışmıyor
Raj Aggrawal

Varsayılan yüksekliği xib / storyboard'da ayarlarsak, bu yöntemleri uygulamamız gerekmez.
Satyam

77

Ayrıca yapılabilecek şey, içerik görünümünün üstünden ve altından dikey sınırlamalar eklemektir. Bu, otomatik düzeni mutlu edecek (çünkü artık hücrenin yüksekliğini nasıl hesaplayacağını kendisi biliyor).


2
Bu benim için çalıştı. Tüm kapsayıcı hücrelerini inceledim ve en az bir alt görünümün hem "üst boşluktan kapsayıcıya" hem de "alttan kapsayıcıya" kısıtlamasına sahip olduğundan emin oldum.
Rog182

7
Kendi boyutlarını belirleyen tablo görünümü hücrelerini kullanırken iOS 8 için doğru cevap budur.
tsafrir

1
İçerik görünümünün içindeki öğelerden içerik görünümünün üstüne ve altına kadar olan kısıtlamaları mı kastediyorsunuz?
Zack Shapiro

Bunu denedim ama çelişkili kısıtlama uyarısı almaya devam ediyorum.
Shirish Kumar

2
Hücrenin kendisine değil, hücrenin içerik görünümüne üst ve alt kısıtlamayı eklediğinizden emin olun. Hücreye kısıtlama eklerseniz, kod çalışmaya devam edecek ancak 0 yüksekliğini kullanmaya çalışacaktır.
frin

26

AutoLayout kısıtlamaları ve UITableViewAutomaticDimension kullanıyorsanız, bu hata koddaki boyunuzu geçersiz kılarak göz ardı edilebilecek bazı hatalı bir sorun değildir. Bu, hücre yüksekliğini otomatik olarak belirlemenin işe yaramadığı anlamına gelir çünkü gerekli dikey kısıtlamalara sahip değilsiniz.

Benim gibiyseniz ve bu hatayı alıyorsanız ve hangi hücrenin hatayı attığını belirlemek için yardıma ihtiyacınız varsa, aşağıdaki satırı 'heightforRowAtIndexPath' yönteminizin geri dönüşünden hemen önce ekleyebilirsiniz.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Bu, uzun bir bölümler ve satırlar listesi yazdırır, ancak hata, hataya neden olan belirli hücrenin hemen ardından görünecektir ve soruna hangi hücrenin neden olduğunu hızlı bir şekilde belirleyebilir ve kısıtlamalarınızı buna göre düzeltebilirsiniz. Bu, özellikle statik hücreler için faydalıdır. Yüksekliği manuel olarak girilen bir sayı ile geçersiz kılmak, autoLayout ve otomatik hücre yüksekliklerini kullanmıyorsanız işe yarayacaktır, ancak kullanmaya çalıştığınız bir şeyse çok kötü bir çözüm olan bu özellikleri esasen devre dışı bırakacaktır.

Daha önce 'heightForRowAtIndexPath' yöntemini kullanmadıysanız ancak UITableViewAutomaticDimension ayarınızı geri almadan bu hatayı ayıklamak istiyorsanız, bunu kodunuza eklemeniz yeterlidir:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

Çok teşekkür ederim. Bu bana çok yardımcı oldu. İlk başta bu sorunun başka bir tablo görüntüleme hücresinde olduğunu düşündüm. Hata ayıkladıktan sonra, bu sorun başka bir problemle ortaya çıktı.
akozin

Bunu yapmak isterdim ama uzun, kesit ve sıra tanımlanamadı. Swift'de bunların ne olması gerektiğini açıklayabilir misin?
DrWhat

9

XCode 6.1'de, otomatik düzen kullanıyorsanız bu soruna neden olan ve her Tablo Görünümü Hücresi için Satır Yüksekliği için bir değer belirtmezseniz, bunun yerine "varsayılan" değeri bırakırsınız. Her hücre için Satır Yüksekliğinin yanındaki "Özel" onay kutusunu işaretlemek, uyarıyı ortadan kaldırır.


2
Kendi boyutlarını belirleyen hücreler kullanıyorsanız, satır yüksekliğini "varsayılan" olarak ayarlamanız gerekir.
phatmann

1
Bu uyarıyı çözdü. Ancak bunun yalnızca TableView'da Statik Hücreler kullanıldığında göründüğüne inanıyorum
MontiRabbit

1
@phatmann Bu sorun yalnızca statik hücreler için görünür, bu nedenle hücreler kendi kendine boyutlandırılmamalıdır.
ltm

@ltm, kullanıcı metni büyütmüşse, statik hücrelerde kendi kendini boyutlandıran hücreler yararlı olmayabilir mi? (Biliyorsunuz, iPhone ayarlarında erişilebilirlik altında)
Byron Coetsee

Bence bu bir hata değil, dikey kısıtlamalarla ilgili bir sorun olabilir, en azından otomatik boyutlu tablo görünümleri için hücrenin yüksekliğini tam olarak tanımlamaları gerekir.
juanjo

3

Evet, tablo görünümü hücresindeki öğeler için yalnızca yatay kısıtlamalarınız olduğunda bile tüm kısıtlamaları "mutlu" alırsınız. Ben de aynı sorunu yaşadım. Dikey sınırlamalar da eklemeniz gerekir. Bunu yapmak, bu uyarı ortadan kalkacaktır.


3

Kısıtlamalar, düzen açısından memnun edici olabilir, ancak otomatik satır yüksekliği amacından memnun olmayabilir. Mutlu bir düzen, içeriğin belirsizlik olmadan düzenlenebileceği anlamına gelir. Bu, Interface Builder'daki kontrolleri tatmin eder.

Otomatik satır yüksekliği için mutlu bir düzen, yukarıdakilere ek olarak, hücrenin alt kısmına da kısıtlamalar eklediğiniz anlamına gelir.

Daha fazlası burada: Kısıtlamaların belirsiz bir şekilde sıfır yüksekliğini önerdiği bir durum tespit edildi


3

Tablo Görünümü boyut denetçisinde Satır Yüksekliği 43'ü (veya <> 44) kullandım ve hata ortadan kalktı. 44 kullanarak hatayı alıyorum. Xcode sürüm 6.0.1.

- Bu cevap bir moderatör tarafından kaldırılmıştır, lütfen yapma, sorunu çözer. Bu benim için sorunu ÇÖZÜYOR ve bunu başkaları için de yapabilir. Bir daha silmemek için çok nazik davranabilir misin?


2

Uyarıyı kaldıramadım, ancak kısıtlamaların çalışması için iOS8'de yeni olan tableview özelliğini estimatedRowHeightsabit yüksekliğe ayarladım ve heightForRowAtIndexPathuygulamayı kaldırdım .


Uyarıyı kaldırmadıysa, eksik kısıtlamayı oluşturan ve satır yüksekliği == değerini cell.rowHeight özelliğine ayarlayan sistemdir. Uyarı, bir otomatik iyileştirme özelliği hakkındadır, eğer otomatik olarak iyileşirse, sorun yok muydu?
Pedro Borges

2

Bu uyarıyı alıyorsanız, bunun nedeni büyük olasılıkla otomatik düzen kullanıyor olmanız ve hücrelerinizin içinde herhangi bir kısıtlama olmamasıdır.

Otomatik mizanpajı kullanmayı bırakmalı veya hücrelerin yüksekliğini açık bir şekilde tanımlayan kısıtlamalar uygulamalısınız.

Sağdaki dosya denetçisindeki "Otomatik Düzen Kullan" seçeneğinin işaretini kaldırarak arayüz oluşturucudaki otomatik düzeni kapatabilirsiniz.

Otomatik düzeni kullanmayı seçerseniz ve hücrelerinizin yüksekliği sabitse, uygun kısıtlamaları uygulamak kolay olmalıdır. Yalnızca hücrenin içerik görünümünün alt görünümleri için yükseklik kısıtlamaları ekleyin ve alt görünümler arasında ve alt görünümler ile içerik görünümü arasında dikey alan kısıtlamaları uygulayın. Örneğin, hücrenizde bir etiket varsa, bu işe yarar:

Dikey kısıtlamalar

  1. İçerik görünümünün üst kısmı ile etiketin üstü arasındaki dikey boşluk sınırlaması
  2. Etiketin sabit yükseklik kısıtlaması
  3. Etiketin altı ile içerik görünümünün altı arasındaki dikey boşluk sınırlaması

Yatay kısıtlamalar

  1. İçerik görünümünün ön kenarı ile etiketin ön kenarı arasındaki yatay boşluk sınırlaması
  2. Etiketin sabit genişlik sınırlaması
  3. Etiketin arka kenarı ile içerik görünümünün arka kenarı arasındaki yatay boşluk sınırlaması

Kısıtlamalar kullanıyorum ve soruda da belirtildiği gibi hepsi mutlu görünüyor.
Chris

Bu kısıtlamalar hücrenin içerik görünümünün alt görünümleri için mi? Neye benziyorlar? Farklı hücrelerinizin olması mümkün mü? Hücreleri Frederic Bonner'ın çözümlerini kullanarak sabit bir yüksekliğe sahip olacak şekilde tanımlıyorsanız, kısıtlamalar geçersiz kılınır.
wrightak


1

In Swift zorlayarak bir dönüş yüksekliği sorunumu düzeltildi:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

Bir bataklık standardı düzeltmesi için, kısıtlama yok, yükseklik tahmini yok veya problemi aşırı mühendislik. Varsayılan bir proje oluşturdum, tablo görünümünü bağladım ancak yükseklik temsilcisini görünüm denetleyicisine koymayı unuttum . Bu uyarıyı basitçe ortadan kaldırmak için buna ihtiyacınız var.

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

Tablonuzun görünüm denetleyicisinde.


1

Uitableviewcell içinde bir mapView kullanıyordum. Harita görünümünün yüksekliğini cihaz ekran boyutunun 1 / 3'ü olarak değiştirdim. Aynı hatayı aldım. Uitableviewcell içerik görünümüne eksik kısıtlamalar ekleyerek hatayı düzelttim.

1) contentView kısıtlamalarını temizleyin.

2) ContentView olarak Önerilen sabitlere Sıfırla'yı ayarlayın.

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

3) Eksik kısıtlamaları ekleyin - varsa

4) İçerik görünümünün gerekli tüm kısıtlamalara sahip olduğundan emin oluruz. görüntü açıklamasını buraya girin


0

Benim durumumda, hücreyi xib ile tasarladığım ve bu xib dosyasını hedefe eklemeyi unuttuğum için.

Bu xib dosyasını hedefe ekledikten sonra sorun ortadan kalktı


0

Bu sayfadaki yükseklik kısıtlamaları eklemeyi veya heightForRowAtIndexPath'deki 44 gibi rowHeights'ı manuel olarak döndürmeyi tartışan yanıtlar uyarının kaybolmasına neden olurken, bunlar gereksizdir çünkü bu Xcode'da bir hata Xcode'da en az Sürüm 6.3.2'de (6D2105) görülebilen .

ViewDidLoad'da bir kesme noktası ayarlarsanız, film şeridinde 44 satır yüksekliğini belirtseniz bile self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) olduğunu görürsünüz. Bunun nedeni, satır yüksekliğini 44'te bırakırsanız, Apple'ın yanlışlıkla dinamik satır yükseklikleri istediğinizi varsaymasıdır, çünkü tercihinizi belirtmeniz için size bir bayrak sağlamazlar.

İşte bazı olası çözümler ve sonuçları:

  • Film şeridinde satır yüksekliğini 43 veya 45 olarak ayarlayın (çalışır).

  • El ile heightForRowAtIndexPath'de 44 yükseklik döndürür (çalışır).

  • UITableViewCell öğeleri ve contentView (çalışır) arasına yükseklik kısıtlamaları ekleyin.

Ne yazık ki, bu çözümler ya tasarımınızı değiştirmenizi, gereksiz kısıtlamalar eklemenizi ya da bir hatayı çözmek için gereksiz kod eklemenizi gerektirir. En basit çözümü denedim (düşündüğüm şeyi):

  • Film şeridinde her bir UITableViewCell'in yüksekliğini 44 (Özel) olarak ayarlayın (başarısız olur).

Buna gerçekten saf bir storyboard çözümü istedim, bu yüzden sonunda denedim:

  • Film şeridindeki UITableView'a kullanıcı tanımlı bir çalışma zamanı özniteliği ekleyin ve UITableView'e, gelecekteki geliştiricilerin bulabilmesi için rowHeight'ın nasıl ayarlandığına ilişkin bir notla birlikte adlandırın: (çalışır):

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

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

Bu hataların tümü iOS geliştirmede çok yaygındır ve geliştiricileri, çözümlerinin uzun vadede sürdürülebilirliği nasıl etkileyeceğinin sonuçlarını tartmak için aşırı zaman harcamaya zorlar.

Sürdürülebilir ve karmaşık görünmeyen kavramsal olarak doğru bir çözüm bulmak çok zor olduğundan ve Apple'ın hatayı düzelteceğini ve 44'ün öngörülebilir gelecek için varsayılan satır yüksekliği olacağını varsaymak, o zaman kısıtlama veya kullanıcı tanımlı runtime öznitelik çözümleri muhtemelen bakımı en kolay olanlardır.


0

Sanırım burada iki önemli şey oluyor.

1) ctrl + sürükleme yapıyorsanız kısıtlamaları yanlış yapmak çok kolaydır. Bu yüzden, doğru şekilde yaptığınızı iki kez kontrol edin. Bu kısıtlamaları çizmek için ekranın sol tarafındaki tepsiyi kullanmak en iyisidir.

2) ViewDidLoad'da veya başka bir yerde tahminiRowHeight belirtmek yerine, temsilci yöntemini kullanın

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Bu benim için sorunu hemen çözdü.


Neden geçersiz kılmayı kullanıyorsunuz?
FractalDoctor

0

Bu hatayı evrensel hikaye tahtaları veya xibs kullanırken de gördüm. Any x Any size sınıfı için uygun kısıtlamaları belirtmeyi ihmal ederseniz, bu hatanın göründüğünü gördüm.

Apple bunu iOS9 için düzeltti gibi görünüyor. Hata sadece benim için 8.4'te oldu.


0

Bu hata ile istediğim kısıtlamalarla çelişen kısıtlamaların oluşturulduğu (nerede olduğu hakkında hiçbir fikrim yok) başka bir hata arasında günlerce dönüp durdum. Hatta onu, her görünür özelliğin diğeriyle aynı olduğu bir durumda çalıştırdım. Bulduğum tek çözüm atomik olmaktı - xib ile tamamen yeni bir dosya oluşturmak ve eski kodu kopyalayıp yapıştırarak çıkışları yeniden bağlamaya başlamak. En iyi çözüm olmayabilir, ancak bazen sorun görünmüyorsa yapılacak çok az şey vardır. En azından atomik olmak, neler olup bittiğini gözden geçirmenin iyi bir yoludur.

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.