2013-08-23 18 views
9

bu uyarıları görmek oldukça can sıkıcı sonuçsal olmasa da:Başlangıçta sıfır boyutlu görünüm için tatmin edici olmayan düzen kısıtlamaları için daha iyi bir çözüm?

benim kısıtlamaları yanlış bir şey yok
Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) (
    "<NSLayoutConstraint:0x19288a20 V:|-(6)-[UILabel:0x19288640] (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0)>", 
    "<NSLayoutConstraint:0x19288a70 V:[UILabel:0x19288640]-(6)-| (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x19289cd0 h=--& v=--& V:[_UITableViewHeaderFooterContentView:0x192885b0(0)]>") 

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x19288a70 V:[UILabel:0x19288640]-(6)-| (Names: '|':_UITableViewHeaderFooterContentView:0x192885b0)> 

. UIKit, görünüm sıfır boyutunda olduğunda, bu kısıtlamalarla UITableViewHeaderFooterView için düzen yapmaya çalıştığında sorun oluşur. Elbette herhangi bir kısıtlamadan herhangi bir olumlu ölçütle tatmin etmek imkansızdır.

Açık bir çözüm, UILayoutPriorityRequired önceliğinden daha düşük bir değere ayarlamak veya her bir pozitif metrik için NSLayoutRelationEqual yerine NSLayoutRelationLessThanOrEqual kullanın. Ama sonra bu koltuk değneklerimi tüm görüşlerim üzerindeki tüm kısıtlarıma eklemem gerekiyor. Gerçekten istediğim şeyin zor ve hızlı değil, isteğe bağlı kısıtları olduğunu belirtmemek.

Başka bir geçici çözüm, UITableViewHeaderFooterView için bir başlangıç ​​çerçevesi belirlemektir. Ancak, atanan init yöntemini dikkate alarak-initWithFrame: değil ve UITableViewHeaderFooterView için çerçeveyi belirtmek UITableView ve UITableViewDelegate'un sorumluluğundadır, ne iyi bir çözümdür.

Yani daha iyi olanları?

cevap

10

Sorununuzun, "kapsayıcı" boyutlandırma kısıtlamalarını UITableViewHeaderFooterView örneğine ayarlama girişiminden kaynaklandığını düşünüyorum. Sorun, otomatik düzende here sorgusuna göre hücrelerini kendilerinin boyutlandırmak istemesine benzer.

Bu soru için özel olarak, görünüm sıfır büyüklüğüne sahiptir, ancak kısıtlamalar, görüntünün (geçerli durumu ihlal eden) en az 12pt olmasını gerektirmektedir. Bu özellikle bu durumda ihlal edilir ve üstyapı/altbilgi görünümü, otomatik düzen değil, çerçeveler/otomatikleştirici maskeler kullanılarak boyutlandırıldığı için ele alınamaz, bu nedenle istisna.

Bu vaka için iki seçenek vardır: Eğer kısıtlamaları yaparak sorunun ikinci kısmında önerilen gibi var "gereklidir" kısıtlamaları az Make

  1. öncelikli 1000'den az
  2. ertele kısıtlamalarınızın üstbilgi/altbilgi tanımlanmış bir boyuta sahip olana kadar yüklenmesi. Görüşünüzün bir boyuta sahip olacağını ve kısıtlamalarınızın anlamlı olduğunu biliyorsunuz. Kısıtlamalarınız, bir kenarda 12pt'den daha az bir görünüm için sisteminize anlam ifade etmez (sizin durumunuzda yatay olarak). (Zaten işin yoksa)
  3. sizin UITableViewHeaderFooterView alt sınıfının updateConstraints da kısıtlamaları (yalnızca bir kez) takın olmayan bir sıfır bounds.size veya buraya layoutSubviews gözden geçiriyorum
    1. : Sen tarafından birlikte kesmek olabilir.
    2. Yukarıdaki iki çözümü de birleştirebilir ve yalnızca updateConstraints adresinde otomatik düzen kısıtlamalarınızı self.bounds.size'un CGSizeZero olmadığını tespit ederseniz (bu uygun çözüm olacaktır).
+0

Arabirim Oluşturucusu kullanan kişiler için hangi çözümü önerirsiniz? – thedeveloper3124

+1

@walapu Muhtemelen yukarıdaki # 1 ile gitmek ve CGSizeZero durumunda bir istisna atmamak için görüşünüze daha az sert (öncelik <1000) kısıtlamaları vermek isteyeceksiniz. – larsacus

+1

Bu çözüme http://stackoverflow.com/a/35053234/1275014 adresinden gidiyorum, çünkü daha az katı kısıtlamalar getiriyor ancak UILabels ile çalışmıyor – thedeveloper3124

İlgili konular