当我添加自动布局时,视图会消失

时间:2015-06-04 03:56:18

标签: ios objective-c autolayout nslayoutconstraint

我在整体label中有1 UICollectionView和1 view。我试图让它们像下图所示:

我无法使用故事板来应用自动布局,我必须以编程方式进行操作,而且我很难做到这一点。这就是我所拥有的:

CGRect collectionViewFrame = CGRectMake(0, 20, self.bounds.size.width, self.bounds.size.height - 20);
_datesCollectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:collectionViewLayout];

_labelToChange = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 20)];

[_labelToChange setTranslatesAutoresizingMaskIntoConstraints:NO];
[datesCollectionView setTranslatesAutoresizingMaskIntoConstraints:NO];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_labelToChange]-[_datesCollectionView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange, _datesCollectionView)]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_labelToChange]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_labelToChange]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange)]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_datesCollectionView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_datesCollectionView)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_datesCollectionView]|"options:0 metrics:nil views:NSDictionaryOfVariableBindings(_datesCollectionView)]];

当我在模拟器上运行它时,我看不到任何视图,我收到以下错误:

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:0x7fa080d801b0 H:|-(0)-[DIDatepicker:0x7fa080d7f9a0]   (Names: '|':UITableViewCellContentView:0x7fa080d7f360 )>",
    "<NSLayoutConstraint:0x7fa080d80250 H:[DIDatepicker:0x7fa080d7f9a0]-(0)-|   (Names: '|':UITableViewCellContentView:0x7fa080d7f360 )>",
    "<NSLayoutConstraint:0x7fa080da9120 H:[UILabel:0x7fa080da8350]-(0)-[UICollectionView:0x7fa081159000]>",
    "<NSLayoutConstraint:0x7fa080daa7e0 H:[UILabel:0x7fa080da8350]-(0)-|   (Names: '|':DIDatepicker:0x7fa080d7f9a0 )>",
    "<NSLayoutConstraint:0x7fa080daab50 H:|-(0)-[UICollectionView:0x7fa081159000]   (Names: '|':DIDatepicker:0x7fa080d7f9a0 )>",
    "<NSLayoutConstraint:0x7fa080db70c0 'fittingSizeHTarget' H:[UITableViewCellContentView:0x7fa080d7f360(375)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fa080da9120 H:[UILabel:0x7fa080da8350]-(0)-[UICollectionView:0x7fa081159000]>

我做错了什么,我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:1)

你的约束:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_labelToChange]-[_datesCollectionView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange, _datesCollectionView)]];

与约束冲突:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_labelToChange]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_datesCollectionView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_datesCollectionView)]];

您需要替换如下所示的约束:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_labelToChange(20)]-0-[_datesCollectionView]-0-|" options:0 metrics:nil views:dict]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_labelToChange]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_datesCollectionView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_datesCollectionView)]];

希望它有所帮助.. :)

答案 1 :(得分:0)

这条线是暧昧的:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_labelToChange]-[_datesCollectionView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_labelToChange, _datesCollectionView)]];

并且您没有为视图定义任何宽度或高度信息。 AutoLayout没有足够的信息来布局您的视图。

请改为尝试:

NSDictionary *dict = NSDictionaryOfVariableBindings(_labelToChange, _datesCollectionView);

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_labelToChange(80)]-0-[_datesCollectionView]-0-|" options:0 metrics:nil views:dict]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_labelToChange]-0-|" options:0 metrics:nil views:dict]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_datesCollectionView]-0-|" options:0 metrics:nil views:dict]];

我在这里做的是,我已经将标签定义为80像素高,然后collectionview占据了superview的其余高度。