UIView不遵守UIScrollView中的autolayout约束

Ben*_*ard 5 cocoa-touch uiview ios autolayout

我正在添加一个UIView UIScrollView并对其进行约束,使其填充水平空间,除了一些边距.我的视觉约束看起来像这样:

@"|-16-[theLineView]-16-|"
Run Code Online (Sandbox Code Playgroud)

我已将视图设置为一个像素高,因此它将显示为一条线,并将其放在两个文本标签之间:

@"V:[someOtherStuff]-[aTextLabel]-[theLineView]-[anotherLabel]"
Run Code Online (Sandbox Code Playgroud)

但是,我发现线条的宽度只扩展到它上面/下面最长标签的宽度.

为什么会这样?

PS我已阅读此http://developer.apple.com/library/ios/#technotes/tn2154/_index.html

在此输入图像描述

以下是来自测试项目的整个视图控制器代码,该测试项目在iPad上显示此问题.

- (void)viewDidLoad
Run Code Online (Sandbox Code Playgroud)

{[super viewDidLoad];

self.scrollView = [[UIScrollView alloc] init];
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.scrollView.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.scrollView];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[scrollView]|"
                                                                 options:0
                                                                 metrics:0
                                                                   views:@{@"scrollView":self.scrollView}]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                                  options:0
                                                                  metrics:0
                                                                    views:@{@"scrollView":self.scrollView}]];

self.line1 = [[UIView alloc] init];
self.line2 = [[UIView alloc] init];
self.label1 = [[UILabel alloc] init];
self.label2 = [[UILabel alloc] init];
self.label3 = [[UILabel alloc] init];

for (UILabel *label in @[self.label1, self.label2, self.label3])
{
    label.text = @"I am a label and I am long enough that I can be multiline on an iphone but single on ipad";
}

for (UIView *view in @[self.line1, self.line2, self.label1, self.label2, self.label3])
{
    view.translatesAutoresizingMaskIntoConstraints = NO;
    view.backgroundColor = [UIColor redColor];
    [self.scrollView addSubview:view];
}

//horizontal layout - all views/labels should fill the horizontal space expect for margin
for (UIView *view in  @[self.line1, self.line2, self.label1, self.label2, self.label3])
{
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-16-[view]-16-|"
                                                                   options:0
                                                                   metrics:0
                                                                     views:@{@"view":view}];
    [self.scrollView addConstraints:constraints];
}

//vertical layout - stack em up
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lab1]-[line1(==1)]-[lab2]-[line2(==1)]-[lab3]-|"
                                                                  options:0
                                                                  metrics:0
                                                                    views:@{@"lab1":self.label1, @"line1":self.line1, @"lab2":self.label2, @"line2":self.line2, @"lab3":self.label3}]];
Run Code Online (Sandbox Code Playgroud)

}

pat*_*nke 7

UIScrollView会自动缩小以适应其中的视图.你需要在某个地方设置宽度.

推荐策略:

  1. 使用约束(前导,尾随,顶部,底部)在其父视图内完全固定scrollview.
  2. 在UIScrollView中创建一个UIView,并将所需内容放入其中.
  3. 设置约束,以便UIView将充当内容视图(这意味着它足以包含所有元素).使用内在的内容大小,抗收缩性和元素的链接有很多约束.生成的布局必须定义明确且唯一(这意味着如果要将所有约束移除到外部,布局仍然有效).
  4. 连接UIView的边界与他们的superview(这是UIScrollView的实际内容视图,而不是UIScrollView!).

如果在interface-builder中执行此操作(可能),则每次触摸该场景中的某些内容时都需要重新检查约束.通过触摸我的意思是"选择"不仅"修改".

  • 这有效.在我看来,4号是更好的方法,因为它很简单并且避免任何幻数(这意味着它支持旋转等). (3认同)