更正UITableViewHeaderFooterView的子类化和自动布局
以下是我在UITableViewHeaderFooterView视图中设置的东西。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self.contentView addSubview:self.createHeader]; } return self; } - (UIView *)createHeader { UIView *headerContainer = [[UIView alloc] init]; headerContainer.backgroundColor = [UIColor blackColor]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; label.translatesAutoresizingMaskIntoConstraints = NO; label.text = @"titlename"; [headerContainer addSubview:label]; NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeLeft multiplier:1.f constant:16.f]; [headerContainer addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeRight multiplier:1.f constant:-16.f]; [headerContainer addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeTop multiplier:1.f constant:0.f]; [headerContainer addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]; [headerContainer addConstraint:constraint]; return headerContainer; }
我得到这个自动布局错误:
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:0xd4bd7e0 UILabel:0x17254980.leading == UIView:0x172547d0.left + 16>", "<NSLayoutConstraint:0xd4bd810 UILabel:0x17254980.trailing == UIView:0x172547d0.right - 16>", "<NSAutoresizingMaskLayoutConstraint:0xd402510 h=--& v=--& H:[UIView:0x172547d0(0)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0xd4bd810 UILabel:0x17254980.trailing == UIView:0x172547d0.right - 16>
线索是在那里的错误: translatesAutoresizingMaskIntoConstraints
。
我会说你需要添加下面的行到你的createHeader
方法:
headerContainer.translatesAutoresizingMaskIntoConstraints = NO;
这是第二个想法。 看起来你想把你的标签放在headerContainer中,对不对? 代替:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeLeft multiplier:1.f constant:16.f]; [headerContainer addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTrailing relatedBy: NSLayoutRelationLessThanOrEqual toItem:headerContainer attribute:NSLayoutAttributeRight multiplier:1.f constant:-16.f]; [headerContainer addConstraint:constraint];
尝试:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:headerContainer attribute:NSLayoutAttributeLeft multiplier:1.f constant:16.f]; [headerContainer addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:label attribute:NSLayoutAttributeLeading multiplier:1.f constant:0]; [headerContainer addConstraint:constraint];