2012-12-13 18 views
7

UICollectionViewCell alt sınıfını ve tüm düzeni otomatik düzende kod içinde yapıyorum. Bu benim init metodu: Ben translateAutoresizingMask satırını açıklama yaparkenÖzel UICollectionViewCell Otomatik Düzenleme NSInternalInconsistencyException error

- (id)initWithFrame:(CGRect)frame{ 
    frame = CGRectMake(0, 0, 403, 533); 
    if (self = [super initWithFrame:frame]) { 
     self.translatesAutoresizingMaskIntoConstraints = NO; 

     PBCardPricesViewController *pricesView = [[PBCardPricesViewController alloc] init]; 
     [self addSubview:pricesView.view]; 

     UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CardBackground"]]; 
     [self addSubview:background]; 

     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(20)-[background]|" options:0 metrics:nil views:@{@"background":background}]]; 
     [self addConstraint:[NSLayoutConstraint constraintWithItem:pricesView.view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:background attribute:NSLayoutAttributeLeft multiplier:1 constant:0]]; 

     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[background]|" options:0 metrics:nil views:@{@"background":background}]]; 
     [self addConstraint:[NSLayoutConstraint constraintWithItem:pricesView.view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:background attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; 
    } 

    return self; 
} 

alıyorum: Ben bu hatayı alamadım zaman

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:0x1d83f540 H:[UIImageView:0x1d83f950]-(0)-| (Names: '|':PBCardViewCollectionCell:0x1d83b970)>", 

    "<NSAutoresizingMaskLayoutConstraint:0x1c55ad20 h=--& v=--& H:[PBCardViewCollectionCell:0x1d83b970(393)]>", 

    "<NSAutoresizingMaskLayoutConstraint:0x1c559410 h=--& v=--& UIImageView:0x1d83f950.midX == + 191.5>", 

    "<NSAutoresizingMaskLayoutConstraint:0x1c559450 h=--& v=--& H:[UIImageView:0x1d83f950(383)]>" 

) 



Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x1d83f540 H:[UIImageView:0x1d83f950]-(0)-| (Names: '|':PBCardViewCollectionCell:0x1d83b970)> 



Break on objc_exception_throw to catch this in the debugger. 

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UICollectionView's implementation of -layoutSubviews needs to call super.' Bunu nasıl göstermek için alırım istediğim şekilde mi? Neyi kaçırıyorum?

+0

"@" | - (20) - [background] | "" önünde bir H: olması gerekiyor mu, yoksa bilmediğim bir sözdizim stili mi? Ayrıca, "pricesView" init işlevinden sonra serbest bırakılacak gibi görünüyor ... böylece sadece görünümünüz var. Bu sorunlara neden olacak mı? – yuf

+0

H: isteğe bağlıdır. Bir H veya bir V belirtilmemişse, varsayılan değer H'dir. Şu an için denetleyici denetleyicisi kaybı iyidir. Sadece düzeni indirmeye çalışıyorum. – Civatrix

+0

Gotcha, H, havalı hakkında bilmiyordum. Otomatik yeniden boyutlandırma maskesini kaldırmadan kısıtlama hatalarını gidermeyi denediniz mi? Maskenin hücrede gerekli olduğunu düşünüyorum ... Bunun yerine, backgroundView.translatesAutoresizingMaskIntoConstraints = NO; ve pricesView.view.translatesAutoresizingMaskIntoConstraints = NO; – yuf

cevap

14

cevap olarak yorumumu Gönderme: deneyimlerimi ise

, collectionViewCells (ve tableViewCells) kendi autoresizingmask gerektiren veya onlar gördüğünüz istisna. Ama bu yüzden sadece onun subviews gelen maskeyi kaldırmak, eklediğiniz subviews nedeniyle kısıt çatışmaları alıyorsanız:

backgroundView.translatesAutoresizingMaskIntoConstraints = NO; 
pricesView.view.translatesAutoresizingMaskIntoConstraints = NO; // you might get it to work without doing this line 

Ben de alloc kullanarak oluşturduğunuz görünümlerde maske kaldırmak için hatırlamaya çalışın (yani bir xib gelen), çoğu zaman çatışmalar veriyorlar.

+0

Tekrar teşekkürler, yeni otomatik düzen ile öğrenecek çok şey var. – Civatrix

+7

Aslında bunu [contentView'] 'de ayarladım (https://github.com/artsy/eidolon/pull/123/files#diff-d8eaed9deb2eb4f390a6c8a637465fdbR33). –

+0

Bunu içerikte ayarlamaBu da benim için gerekliydi, ardından genişlik ve yükseklik kısıtlamaları ekliyordu – Philip

İlgili konular