约束两个视图以使用视觉格式填充屏幕时忽略第二个视图的大小

Posted

技术标签:

【中文标题】约束两个视图以使用视觉格式填充屏幕时忽略第二个视图的大小【英文标题】:Second view's size is ignored when constraining two views to fill the screen with visual format 【发布时间】:2015-11-26 06:12:20 【问题描述】:

我正在尝试设置两个视图的宽度应填满屏幕的约束。如果我改变一个视图的宽度,另一个视图应该相应地改变:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[view1]-8-[view2]-8-|" options:0 metrics:nil views:views]];

我认为这很简单,但是代码似乎忽略了view2 的大小。 view1不断获取屏幕的整个宽度,设置view2的边框不会影响view1的宽度。

我错过了什么?

【问题讨论】:

【参考方案1】:

也为view2 分配一个最小尺寸约束,否则“0 宽度”将是约束的有效解决方案。

[NSLayoutConstraint activateConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[view1(>=minSize)]-8-[view2(>=minSize)]-8-|" 
                                            options:0 
                                            metrics:@@"minSize" : @50 
                                              views:views]];

另外,不要再使用addConstraints: (ios 8+)。使用-[NSLayoutConstraint setActive:]+[NSLayoutConstraint activateConstraints:]

至于更改view2 的大小,在使用自动布局时不能直接设置视图的框架。该值将在下一次布局传递时被覆盖。您应该为视图创建一个明确的宽度约束:

[NSLayoutConstraint constraintWithItem:view2
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:nil
                             attribute:NSLayoutAttributeNotAnAttribute
                            multiplier:1.0
                              constant:120];

然后在需要更改视图大小时调整该约束的常量。

【讨论】:

感谢您的提示。这会增加 view2 的大小,但是当我设置 view2 的框架宽度时没有任何反应。这就像 view1 har 优先级。顺便说一句,我需要支持 iOS7。 您是直接设置框架,还是添加宽度约束?当您使用自动布局时,执行前者是无效的;这就是自动布局的重点。 我正在尝试设置约束,以便如果我的 view2 发生更改,view1 应该相应地更改。我是否滥用了自动布局? 在什么情况下视图的宽度会发生变化? 在此处查看答案 - ***.com/questions/12622424/… 获取动画约束更改的代码,这样您就可以通过漂亮的动画调整视图大小

以上是关于约束两个视图以使用视觉格式填充屏幕时忽略第二个视图的大小的主要内容,如果未能解决你的问题,请参考以下文章

堆栈视图中的对齐

以编程方式修改自动布局约束时视图不更新

在部分视图 MVC5 之间传递视图模型

如何使用自动布局约束在单个屏幕中放置两个视图

我应该使用啥约束来让图像视图方面填充其父视图的下半部分?

选择 TableView 项目时如何调出 ViewController?