ios - UIView 不遵守 UIScrollView 中的自动布局约束

标签 ios cocoa-touch uiview autolayout

我将 UIView 添加到 UIScrollView 并对其进行约束,使其填充水平空间,但一些边距除外。我的视觉约束看起来像这样:

@"|-16-[theLineView]-16-|"

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

@"V:[someOtherStuff]-[aTextLabel]-[theLineView]-[anotherLabel]"

但是,我发现线条的宽度只会扩展到其上方/下方最长标签的宽度。

为什么会这样?

P.S 我读过这个http://developer.apple.com/library/ios/#technotes/tn2154/_index.html

enter image description here

代码

这是在 iPad sim 上显示此问题的测试项目中的完整 View Controller 代码。

- (void)viewDidLoad

{ [ 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}]];

最佳答案

UIScrollView 会自动缩小以适应其中的 View 。您需要在某处绝对设置宽度。

推荐策略:

  1. 使用约束(前导、尾随、顶部、底部)将 ScrollView 完全固定在其父 View 内。
  2. 在 UIScrollView 中创建一个 UIView 并将您需要的所有内容放入其中。
  3. 设置约束,使 UIView 充当内容 View (这意味着它足够大以包含所有元素)。大量使用内在的内容大小、抗收缩和带约束的元素链接。生成的布局必须定义明确且唯一(这意味着如果您要删除所有外部约束,布局仍然有效)。
  4. 将 UIView 的边界与其 super View (这是 UIScrollView 的实际内容 View ,而不是 UIScrollView!)连接起来。

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

关于ios - UIView 不遵守 UIScrollView 中的自动布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17773001/

相关文章:

ios - 如何从导航 Controller 中删除 View

ios - cocoa touch 中多个 NSNotifcationCenter 实例的缺点

iphone - 在 View 过渡动画完成后执行选择器或动画

iPhone:如何设置 UIViewController 框架?

swift - 我可以从 Storyboard 中实例化一个 Swift 自定义 UIView 而无需嵌套吗?

ios - Xcode 12 - 当有另一个 Swift 包作为依赖项时,SwiftUI 预览在 Swift 包上不起作用 - 'previewInstances' 给代理的消息

iphone - 通过通知执行选择器OnMainThread

ios - 在状态栏上方添加 subview iOS 7

cocoa-touch - iOS UIAlertView 其他按钮操作

iphone - UIButton 过度敏感