我正在为UICollectionViewCell创建子类,并使用自动布局在代码中进行所有布局。这是我的init方法:
- (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;
}
当我注释掉translateAutoresizingMask行时,我得到:
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.'
如何让它显示我想要的方式?我错过了什么?
答案 0 :(得分:14)
发表评论作为答案:
根据我的经验,collectionViewCells(和tableViewCells)需要他们的autoresizingmask或者他们抛出你看到的异常。但是由于您添加的子视图,您将遇到约束冲突,因此只需从其子视图中删除掩码:
backgroundView.translatesAutoresizingMaskIntoConstraints = NO;
pricesView.view.translatesAutoresizingMaskIntoConstraints = NO; // you might get it to work without doing this line
我还试着记住在我使用alloc创建的视图上删除掩码(即不是从xib中删除),因为大多数时候它们会产生冲突。