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

标签 ios objective-c cocoa-touch nslayoutconstraint visual-format-language

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

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

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

我错过了什么?

最佳答案

同时为 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的大小,当你使用自动布局时你不能直接设置 View 的框架。该值将在下一个布局过程中被覆盖。您应该为 View 创建一个明确的宽度约束:

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

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

关于ios - 约束两个 View 以用视觉格式填充屏幕时忽略第二个 View 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33931725/

相关文章:

ios - 如何从 Storyboard 中找到 UI 按钮的操作?

ios - 使用关键字过滤数组

ios - 将 UIScrollView 连接到 IBOutlet

objective-c - "Incompatible pointer..."将委托(delegate)分配给自己时发出警告

ios - 使用大标题时,不会触发 UIScrollView 中的 UIRefreshControl

objective-c - UILabel attributedText 和 minimumScaleFactor

ios - NavigationController 中的 ModalViewCOntroller

iOS Swift - 离线可用性

用于 bool 值的 objective-c getter 装饰器

iphone - 从 Nib 加载时,自定义单元永远不会排队?