的开发者, 我在界面生成器(Xcode 5 / iOS 7)中的自动布局遇到了麻烦。 这是非常基础和重要的,所以我认为每个人都应该知道这是如何正确工作的。如果这是Xcode中的一个bug,那它就是一个严重的bug !

所以,每当我有这样的视图层次结构时,我就会遇到麻烦:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView有固定的约束,例如,每边50px(没问题)。 然后我添加一个顶部空间约束UILabel(没有问题)(我甚至可以钉标签的高度/宽度,改变什么,但应该是不必要的,由于标签的内在大小)

当我给UILabel添加一个尾随约束时,问题就开始了:

例如,尾随空间到:Superview等于:25

现在出现了两个警告——我不明白为什么:

A)滚动内容大小不明确(滚动视图具有不明确的滚动内容高度/宽度)

B)视图错位(Label Expected: x= -67 Actual: x= 207)

我在一个新项目中做了这个最小的例子,你可以下载,我附上了一张截图。如你所见,Interface Builder期望Label位于UIScrollView的边界之外(橙色虚线矩形)。用解决问题工具更新标签的框架,将其移到那里。

请注意:如果你用一个UIView替换UIScrollView,行为是预期的(标签的帧是正确的,根据约束)。所以看起来要么是UIScrollView有问题,要么是我错过了一些重要的东西。

当我运行应用程序而不更新标签的框架时,它的位置很好,正是它应该在的地方,UIScrollView是可滚动的。 如果我确实更新了帧,标签就会从视野中消失,UIScrollView也不会滚动。

帮帮我,欧比王·克诺比!为什么是模棱两可的布局?为什么会出现这种错位的观点?

你可以在这里下载示例项目,试着看看你能弄清楚发生了什么: https://github.com/Wirsing84/AutoLayoutProblem


当前回答

我通过使用“解决自动布局问题”>“为所选视图添加缺失约束”来解决我的视图的这种问题

以下两个约束条件可以解决我的问题:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

中: 尾随,bottom是UIScrollView的尾随,底部

其他回答

我所做的是创建一个单独的内容视图,如下所示。

内容视图是自由形式的,可以将所有子视图添加到其中,并带有与contentView相关的约束。

UIScrollView被添加到主视图控制器。

我通过编程方式添加了通过IBOutlet链接到类的contentView,并设置了UIScrollView的contentView。

Swift 4+方法:

1)设置UIScrollView的上、下、左、右边缘为0

2)在UIScrollView中添加一个UIView,并设置顶部、底部、前边距和尾随边距为0(等于UIScrollView的边距)。

3)最重要的部分是设置宽度和高度,其中高度约束的优先级应该低。

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

如果你注意到滚动条在右边滚动,但内容没有移动,那么这个事实可能值得考虑:

您还可以在滚动视图的内容和滚动视图之外的对象之间使用约束,为滚动视图的内容提供固定位置,使该内容看起来漂浮在滚动视图之上。

这是苹果公司的文档。例如,如果你不小心把你的顶部标签/按钮/Img/视图钉在滚动区域之外的视图(也许是一个标题或scrollView上面的东西?)而不是contentView,你会冻结你的整个contentView在适当的位置。

Xcode 11 +。

使用自动布局的最简单方法:

Add UIScrollView and pin it 0,0,0,0 to superview (or your desired size) Add container of UIView type inside ScrollView, pin it 0,0,0,0 to all 4 sides and center it horizontally and vertically. In size inspector of container, change bottom and align center Y priority to 250. (for horizontal scroll change trailing and align center X) Add all views that you need into said container (UIView). Don't forget to set the bottom constraint on the lowest view. Select the UIScrollView, select the size inspector and deselect Content Layout Guides.

我得到了同样的错误。我已经做了以下工作

视图(父视图) 滚动视图0,0600600 ScrollView中的UIView: 0,0,600,600 UIView包含图像视图,标签

现在为scrollView(2)和UIView(3)添加开头/结尾/顶部/底部。

选择视图(1)和视图(3)设置相同的高度和重量。它解决了我的问题。

我已经做了一个视频,这将会有所帮助:

https://www.youtube.com/watch?v=s-CPN3xZS1A