打破父约束的子视图约束

Posted

技术标签:

【中文标题】打破父约束的子视图约束【英文标题】:Subview Constraints breaking Parent Constraints 【发布时间】:2019-08-14 17:33:37 【问题描述】:

我正在制作一个基于约束自动调整大小的自定义选项卡视图,当我尝试向其中添加也使用约束的子视图时遇到问题。

如果我添加一个子视图并对其进行约束,例如:

- (void)awakeFromNib 

[super awakeFromNib];

UIBlurEffect* blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
background = [[UIVisualEffectView alloc] initWithEffect:blur];

NSLayoutConstraint* topConstraint = [NSLayoutConstraint constraintWithItem:background
                                                                 attribute:NSLayoutAttributeTop
                                                                 relatedBy:NSLayoutRelationEqual
                                                                    toItem:self
                                                                 attribute:NSLayoutAttributeTop
                                                                multiplier:1
                                                                  constant:0];
NSLayoutConstraint* leadConstraint = [NSLayoutConstraint constraintWithItem:background
                                                                  attribute:NSLayoutAttributeLeading
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:self
                                                                  attribute:NSLayoutAttributeLeading
                                                                 multiplier:1
                                                                   constant:0];
NSLayoutConstraint* trailConstraint = [NSLayoutConstraint constraintWithItem:background
                                                                   attribute:NSLayoutAttributeTrailing
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self
                                                                   attribute:NSLayoutAttributeTrailing
                                                                  multiplier:1
                                                                    constant:0];
NSLayoutConstraint* botConstraint = [NSLayoutConstraint constraintWithItem:background
                                                                 attribute:NSLayoutAttributeBottom
                                                                 relatedBy:NSLayoutRelationEqual
                                                                    toItem:self
                                                                 attribute:NSLayoutAttributeBottom
                                                                multiplier:1
                                                                  constant:0];
[background setFrame:self.bounds];
[self addSubview:background];
[self addConstraints:@[topConstraint, leadConstraint, trailConstraint, botConstraint]];


标签视图将不再响应约束。如果我将选项卡视图添加到情节提要并尝试对其设置约束,它只是没有响应。我可以手动调整它的大小以使其适应约束,但它不会自动执行,更改设备当然会打破约束。

删除添加约束的这一行可以解决问题,但我希望子视图根据约束自动调整大小。

//[self addConstraints:@[topConstraint, leadConstraint, trailConstraint, botConstraint]];

这可能吗,还是我只需要在调用布局更新时让视图调整其所有子视图的大小?

【问题讨论】:

background.translatesAutoresizingMaskIntoConstraints = NO; 在你之前addConstraints? 【参考方案1】:

正如@DonMag 所说, background.translatesAutoresizingMaskIntoConstraints = NO;也许是一个正确的答案。

或者你可以尝试去掉addConstraints,使用topConstraint.active = YES等

【讨论】:

以上是关于打破父约束的子视图约束的主要内容,如果未能解决你的问题,请参考以下文章

子视图约束到父视图 iOS

使用 Masonry 向视图的子视图添加自动布局约束

Oracle复习约束以及视图

添加到父视图时向 UITableView 添加 AutoLayout 约束

以编程方式将视图添加到垂直堆栈视图打破了垂直堆栈视图的约束

addSubview 打破内部约束