UIScrollView可滚动内容大小歧义


509

资深开发人员,我在Interface Builder(Xcode 5 / iOS 7)中无法使用AutoLayout。这是非常基本和重要的,因此我认为每个人都应该知道它是如何正常工作的。如果这是Xcode中的错误,那就是关键!

因此,每当我拥有这样的视图层次结构时,我都会遇到麻烦:

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

UIScrollView具有固定的约束,例如,每侧50 px(没有问题)。然后,我向UILabel添加一个Top Space约束(没问题)(并且我甚至可以固定标签的高度/宽度,什么都没有改变,但是由于Label的固有尺寸而不必要)

当我向UILabel添加尾随约束时,麻烦就开始了:

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

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

A)可滚动的内容大小含糊(滚动视图具有模糊的可滚动内容高度/宽度)

B)位置错误的视图(标签期望:x = -67实际:x = 207

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

请注意:如果将UIScrollView替换为UIView,则行为符合预期(Label的框架正确且根据约束)。因此,UIScrollView似乎有问题,或者我错过了一些重要的东西。

当我运行应用程序而未按照IB的建议更新Label的框架时,它的位置恰到好处,恰好位于其应有的位置,并且UIScrollView可滚动。如果我更新框架,则标签将不可见,并且UIScrollView不会滚动。

帮我Obi-Wan Kenobi!为什么布局不明确?为什么视图放错了位置?

您可以在此处下载示例项目,然后尝试确定是否发生了什么情况:https : //github.com/Wirsing84/AutoLayoutProblem

Interface Builder中问题的图示


8
尝试将UILabel放置在内容视图中,然后将标签的后沿设置为内容视图(常规UIView)。该视频可能会对您有很大帮助:youtube.com/watch?
v=PgeNPRBrB18&feature=youtu.be

1
很棒的视频,但不能解决我的警告。:(
罗杰斯先生2013年

非常感谢您提供的视频-我从中学到了很多(非常令人惊讶)!但是,当我将视频知识与stackoverflow.com/questions/18953617/…相结合时,我可以修复警告。仍然存在的问题是:如何使scrollView的contentView大小仅在必要时才大?
13年

看一下这个视频。它显示了如何在XCode 5 / iOS 7中使用UIScrollLayout和自动布局。
jaxvy 2014年

我的建议是不要UIScrollView直接使用。取而代之的是使用UICollectionViewUITableView尽可能多地使用这些元素,几乎所有事物都是可能的,并且它还具有简单性,可读性和可重用性!
SPatel

Answers:


1093

因此,我以这种方式进行了整理:

  1. 在里面UIScrollView 添加一个UIView(我们可以称之为contentView);

  2. 在此contentView将上,下,左,右页边距设置为0(当然,scrollView从中为superView);设置水平和垂直对齐中心 ;

成品

现在,您可以添加在您的所有意见contentView,并contentSizescrollView将与根据自动调整大小contentView

更新:

@Sergio在以下评论中发布的这段视频涵盖了一些特殊情况。


33
几乎完美,只是scrollview不再能够猜测内容的长度并相应地调整它的contentSize以适合其中的对象。我在contentView内部有一个tableview,其高度发生变化(通过约束),并且scrollview不允许我滚动。
Cyber​​Mew 2015年

28
也许这段视频可以帮助克服所有剩余的问题。
塞尔吉奥2015年

45
这不会使它滚动。
多利安

2
@MatteoGobbi就是这样!它成功了!挣扎了为期2天的scrollView autoLayout疯狂这种问题....谢谢你老兄!
polo987

55
对于任何面临ScrollView无法滚动的问题的人,以低优先级设置contentView的底部并垂直对齐中心约束对我来说是成功的窍门!
jimmy0251

98

这个错误花了我一段时间才能找到答案,最初我尝试固定ScrollView的大小,但错误消息明确显示为“内容大小”。我确保从ScrollView顶部固定的所有内容也都固定到底部。这样,ScrollView可以通过查找所有对象和约束的高度来计算其内容高度。这解决了内容高度模糊的问题,宽度非常相似...最初,我把大多数X都放在ScrollView的中心,但是我还必须将对象固定在ScrollView的侧面。我不喜欢这样,因为iPhone6的屏幕可能更宽,但它将消除“内容宽度模糊”的错误。


31
谢谢您的回答!如果我理解正确,则可以通过将ScrollView中的每个子视图固定在顶部和底部来消除错误。但是,这不是必需的。您只需要确保有一种方法可以使滚动视图的顶部到底部连续出现约束线。[-XXX]我希望这是可以理解的;>
13年

1
如果视图具有可变的hight,如何解决该问题?然后如何设置约束,以便scrollview可以计算尺寸?
hashier

2
“您只需要确保有一种方法可以使滚动视图的顶部到底部形成连续的约束线” <-谢谢那句话
Adam Waite

3
帮助我的是确保滚动视图固定在超级视图上,而不是顶部或底部布局指南。我删除了底部布局指南的约束,并浏览了菜单而不是界面生成器。编辑器->固定->要查看的底部空间。
Alberto Lopez

2
如果要使scrollview的宽度跟随手机屏幕或UI中其他任何元素(例如包含的UIView)的宽度,则需要使用scrollview外部的另一个元素进行度量,以在其上设置“等于宽度”。
Departamento B

87

Xcode 11以上

使用最简单的方法autolayout

  1. 添加UIScrollView并将其固定0,0,0,0到超级视图(或您想要的尺寸)
  2. 添加UIView滚动型,将其固定0,0,0,0到所有4个方面,并居中horizontallyvertically
  3. 在尺寸检查器中,变化bottomalign center Y优先〜250(对于水平滚动变化trailingalign center X
  4. 将所需的所有视图添加到该视图中。不要忘记在最低视图上设置底部约束。
  5. 选择UIScrollView,选择大小检查器,然后取消选择Content Layout Guides

1
我无法设置scrollview的内容高度,但是可以正常工作。:)
盲忍者

2
提示:在我看来,只有在水平和垂直方向上删除中心并将其替换为相等的宽度(scrollView + scrollView内部的视图)并根据内容添加高度的情况下,它才有效,这意味着视图的最后一个元素需要底部约束。在这里查看更多信息:stackoverflow.com/a/54577278/5056173
肖恩·斯坦斯

1
肖恩(Sean),我每天都在使用这种字体,在垂直和水平滚动视图滚动方面,我从来没有遇到过这种问题。也许您忘了在最低/最后一个元素上放一个底部约束。没有它,这将无法工作。
乔尔杰Nilović

6
要点4-第二句话很重要。
Nitish

1
这个答案对我来说非常有效
satvinder singh

63

它是我的自回答问题UIScrollView +居中视图+滚动内容模糊大小+许多iPhone大小的答案。

但这也完全涵盖了您的情况!

因此,这是最简单情况的初始状态:

  1. 对所有边缘的约束为0的scrollView
  2. 按钮居中水平和垂直固定宽度和高度的限制
  3. 而且,当然是令人讨厌的警告 Has ambiguous scrollable content widthHas ambiguous scrollable content height

1个

所有我们要做的是:

  • 添加2个其他约束,例如对于视图的尾部和/或底部空间添加“ 0” (请看下面的屏幕截图示例)。

重要提示:您必须添加尾随和/或底部约束。不是“领先和领先”-这是行不通的!

2

您可以在我的示例项目中检查它,该项目演示了如何解决此问题。

聚苯乙烯

根据逻辑-此动作应引起“冲突约束”。但不是!

我不知道它为什么起作用,以及Xcode如何检测哪个约束的优先级更高(因为我没有明确为这些约束设置优先级)。如果有人能解释我会很感激,为什么它会在下面的评论中起作用。


大提示!我最终只是对底边创建了一个约束,并将优先级设置为中或低
Dean

哇!严重地,这没有任何意义,但是有效!谢谢!我认为我设置的最后一项是将底部约束设置为0,然后设为BANG。终于工作了。
Jakob Hviid 2015年

60

Xcode 11 +,Swift 5

如果您想知道为什么所有答案都不再起作用,请确保已将内容视图(已放入滚动视图的内容视图)固定到了滚动视图的“内容布局指南”,而不是“框架布局指南”。

内容视图的边缘(前导,尾随,顶部,底部)不应像图像上的引线那样固定-转到“帧布局指南”

不是这样

但是像这样-内容布局指南。

从下拉列表中选择内容布局指南

在此处输入图片说明

然后,大多数答案将对您有用。

现在最简单的方法是这样的:

  1. 将滚动视图放在根视图中
  2. 将滚动视图的所有侧面固定到超级视图
  3. 取另一个UIView(将其称为内容视图)并将其放在滚动视图内
  4. 将内容视图的所有侧面固定到滚动视图的内容布局指南
  5. 将内容视图的宽度固定为等于滚动视图的“框架布局指南”
  6. 以所需的任何方式修复内容视图的高度(在下面的示例中,我仅使用了恒定的高度约束)

总体而言,最简单的实现中的结构如下所示

在此处输入图片说明


@WantToKnow无需考虑高度的限制,只需将其优先级更改为低(250)
Reckoner

Xcode 11 +,Swift5。根据@WantToKnow的答案,我解决了我的问题,准备了[视频] [1]和[代码] [2] [1]:youtube.com/watch? v=qMrH5_Yj5hM [2]:github.com/AhmAbdallah/CustomCollectionView
Ahmed Abdallah

1
这是一个很好的答案,谢谢。
君士坦丁

1
这是正确的答案。谢谢。
Vincent Joy

仅当我在内容视图的最后一个元素中添加底部约束时,这才对我
有用

49

您需要创建一个UIView作为的子视图,UIScrollView如下所述:

  • UIViewController
  • UIView “主视图”
    • UIScrollView
      • UIView “容器视图”
        • [您的内容]

第二步是进行UIScrollView约束。我使用其superView的顶部,底部,前导和尾随约束进行了此操作。

接下来,我为的容器添加了约束UIScrollView,这是问题开始的地方。当您设置相同的约束(顶部,底部,前导和尾随)时,情节提要会发出警告消息:

“具有不确定的可滚动内容宽度”和“具有不确定的可滚动内容高度”

与上述相同的约束继续,只是添加的约束Equal HeightEqual Width你的容器视图相对于主视图,并没有UIScrollView。换句话说,容器视图的约束与UIScrollView的超级视图相关。

之后,您的情节提要中将不会出现警告,您可以继续为子视图添加约束。


2
同意-我认为添加容器视图是最好,最可维护的解决方案。
Andrew Ebling 2014年

1
当您没有导航栏要管理时,此解决方案将起作用。
Leena 2015年

24

我终于想通了,我希望这更容易理解。

正如他们所提到的,通常可以通过将基本UIView作为“内容视图”添加到滚动视图中来绕过该警告,并使其与滚动视图相同,并在此内容视图上设置这6个参数。

在此处输入图片说明

如您所见,您总共需要6个参数!在通常情况下,您会复制两个约束,但这是避免此故事板错误的方法。


1
上面的内容几乎对我有用,因为我担心3种不同的屏幕宽度(4 / 5、6、6 +),所以我将内容视图和滚动视图设置为相等的宽度。没错,它是重复的,因为我已经告诉内容视图开头和结尾的空间为0。
Stuart P.

8
您可以从内容视图到滚动视图设置相等的宽度和高度约束,而不是恒定值。这将适用于所有分辨率。
Kumar C

我必须实现相同的功能,所以您能帮助我为内容视图和滚动视图设置相同的高度和宽度吗?
Urmi '17

可能值得检查,看看是否仍然需要这样做。我最近在滚动视图中设置了一个imageView,并且仅设置顶部显示的4个约束就可以使错误消失,从而使错误在Xcode 8.3中消失
William T.

1
@Honey这是3年前发布的。从那时起,他们肯定改进了情节提要。我也注意到您现在可以不用内容视图了。我会调整答案。
威廉·T。,

24

我遇到过同样的问题。取消选中此复选框。由于您是在代码中设置内容大小。 在此处输入图片说明


16

我知道我可能会迟到,但是下一个解决方案无需使用故事板就可以解决此类问题,而无需添加其他代码

对于您的内容视图,您需要为滚动视图的前/后/上/下空格设置约束,这不会更改内容视图框架,如下所示:在此处输入图片说明

当然,您需要为内容视图创建其他约束,以便滚动视图可以知道内容大小。例如,设置固定高度和中心x。

希望这可以帮助。


7

对我来说,添加a contentView并没有真正按照建议的方式工作。而且,由于添加了视图,因此会产生开销(尽管我认为这不是一个大问题)。对我来说最有效的方法就是关闭的歧义检查scrollView。一切都布置得很好,所以我认为在像我这样的简单情况下还可以。但是请记住,如果您遇到其他限制scrollView,Interface-Builder不会警告您。

在此处输入图片说明


5
这只会删除警告,并且无法解决问题。
Predrag Manojlovic

您。是。我的 英雄。没有意识到它的存在,很高兴找到它!我尝试了“仅验证职位”,您不希望只验证该职位,但是没有,它也允许出现该错误的“内容大小”问题。必须选择“从不验证”。谢谢!
达斯汀

如果您以编程方式创建子视图,我认为这是正确的答案。谢谢!
Florian Kusche


3

参见以下内容:滚动视图中的内容视图垂直和水平集中。您有歧义性错误,请始终确保从内容视图向滚动视图添加的两个内容是:1)。容器的按钮空间。2)在屏幕快照中突出显示的约束约束空间,

这些限制意味着在滚动时,您可以在内容视图的高度或宽度之后滚动多少。

在此处输入图片说明

它可能会帮助您。


3

我通过为“选定的视图”使用“解决自动布局问题”>“添加缺少的约束”为我的视图解决了此类问题 在此处输入图片说明

以下两个约束解决了我的问题:

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

其中:尾部,底部是UIScrollView的尾部,底部


通过添加“自下而上”约束,这对我有用。现在,我考虑了一下,这很有意义。
SilverWolf-恢复莫妮卡

3

使用内容查看(UView)的容器内UIScrollView,坚持边(topbottomtrailingleading)上海华盈的(UIScrollView),并contentView应具有equalwidthequalheight以上海华。这些是约束。并调用方法:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

为我解决了问题。


3

Swift 4+方法:

1)将UIScrollView的上,下,左,右页边距设置为0

2)在UIScrollView内添加一个UIView,并将上,下,前,尾页边距设置为0(等于UIScrollView margins)。

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
}

2

@Matteo Gobbi的答案很完美,但是在我的情况下,scrollview无法滚动,我删除了“ align center Y ”并添加了“ height> = 1 ”,scrollview将变为可滚动的


2

苦于uiscrollview不滚动的人只是使用上一个视图的底部布局(位于内容视图的内部)来设置内容视图的底部约束。不要忘记删除中心Y约束。

其余所有约束与上面定义的相同。Scrollview只关心从其内容视图获取最大高度,我们将其设置为最后一个视图的底部约束,这意味着scrollview会自动更改其内容偏移量。

在我的情况下,最后一个视图是UILable,没有lines属性= 0(它会根据其内容自动调整其高度),因此它会动态增加uilable的高度,并且由于uilable的底部布局与内容视图的底部对齐,因此最终我们的滚动区域会增加,强制scrollview增加其内容偏移量。


2

我在you上做了一个视频
只在Xcode中使用Storyboard在youTube Scroll StackViews

我认为这里可以出现两种情况。

scrollView内部的视图-

  1. 没有任何内部内容大小(例如 UIView
  2. 确实有自己的固有内容大小(例如UIStackView

对于这两种情况下的垂直滚动视图,您都需要添加以下约束:

  1. 顶部,左侧,底部和右侧有4个约束。

  2. 等于scrollview的宽度(停止水平滚动)

对于具有自己固有内容高度的视图,您不需要任何其他约束。

在此处输入图片说明


对于没有任何内部内容高度的视图,您需要添加高度约束。仅当高度限制大于scrollView的高度时,视图才会滚动。

在此处输入图片说明


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

输出:

在此处输入图片说明


当您已经拥有leftAnchor时,为什么还需要LeadingAnchor?
ShadeToD

leftAnchor不能用于此目的,因此我们必须使用LeadingAnchor来实现此目的
。– iAj

您在示例中使用了两者。
ShadeToD

@ShadeToD让我检查一下
iAj

2

就我而言,我收到了iPad中内容大小和内容大小歧义不正确的问题,但在iPhone上可以使用。我在情节提要中进行了以下更改以解决此问题。

  1. 在UIView中添加scrollview,并将前导,顶部,尾部和底部的约束添加到0,0,0,0。
  2. 根据例如的要求设置滚动视图的高度。100
  3. 添加UIView来滚动视图,并向0,0,0,0添加前导,顶部,尾部和底部约束,并对齐center(X)和center(Y)约束。
  4. 在滚动视图的大小检查器中取消选择“内容布局指南”。

1

垂直滚动

  1. 将约束为0,0,0,0的UIScrollView添加到超级视图。
  2. 在ScrollView中添加一个UIView,并将其约束0,0,0,0赋予超级视图。
  3. 为UIView添加相同的宽度约束到UIScrollView。
  4. 将高度添加到UIView。
  5. 将具有约束的元素添加到UIView。
  6. 对于最接近底部的元素,请确保它对UIView的底部具有约束。

0

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

内容视图是自由格式的,可​​以将所有子视图添加到其中,并具有相对于contentView的自身约束。

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

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

通过Interface Builder将UIScrollView与ContentView一起使用


0

我遇到了同样的错误..

  1. 查看(Superview)
  2. ScrollView 0,0,600,600
  3. ScrollView中的UIView:0,0,600,600
  4. UIView包含图像视图,标签

现在,为scrollView(2)和UIView(3)添加前导/后缀/顶部/底部。

选择View(1)和View(3)设置高度和重量相等。.它解决了我的问题。

我已经完成了视频,将对您有帮助:

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


0

[在XCode 7.2和iOS 9.2中进行了测试]

对我来说抑制Storyboard错误和警告的是将滚动视图和内容视图(在我的情况下是stackview)的固有大小设置为Placeholder。在情节提要中的“大小”检查器中可以找到此设置。它说-设置设计时间固有内容大小仅会影响在Interface Builder中进行编辑时的视图。该视图在运行时不会具有此固有内容大小。

因此,我想通过设置此选项并不会出错。

注意:在情节提要中,我已将scrollview的所有边缘固定到超级视图,并将stackview的所有边缘固定到scrollview。在我的代码中,我已将scrollview和stackview 的translatesAutoresizingMaskIntoConstraints设置为false。而且我没有提到内容的大小。当堆栈视图动态增长时,在情节提要中设置的约束可确保堆栈可滚动。

故事板警告使我发疯,我不想为了抑制警告而水平或垂直居中。


0

如果任何人的行为都使您注意到右侧滚动条上的滚动条但内容没有移动,则可能值得考虑以下事实:

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

那是来自Apple的文档。例如,如果您不小心将顶部的Label / Button / Img / View固定在滚动区域之外的视图(可能是标题还是在scrollView上方的东西?)而不是contentView,则会冻结整个contentView。


0

如先前的答案所述,您应该在滚动视图内添加一个自定义视图:

定制视图是图像中标记的ContentView

将所有子视图添加到内容视图。在某个时候,您会看到滚动内容视图的内容大小含糊,请选择内容视图,然后单击“解决自动布局问题”按钮(位于IB布局的右下角),然后选择“添加缺少的内容”约束”选项。

在此处输入图片说明

从现在开始,当您运行项目时,滚动视图将自动更新其内容大小,无需其他代码。


0

您只需要确保有一种方法可以使滚动视图的顶部到底部连续出现约束线。[-XXX]

就我而言-水平滚动滚动视图-我还需要为滚动视图的每个子视图添加宽度和高度限制,尽管Apple的技术说明并未告诉您这一点。



0

如果UIScrollView仍然存在问题,只需关闭内容布局指南 (在xcode Interface Builder中选择ScrollView->在右侧面板中选择“大小”检查器->取消选择“ Content Layout Guides”),或尝试以下步骤:xcode 11滚动视图布局 -它对于新的布局样式很有用。在macOS 10.15.2,Xcode 11.3.1、2020年5月2日正常工作

看截图


0

使用自动版式

将滚动视图添加到定义良好的视图内,然后将堆栈视图添加到滚动视图内

从滚动视图和堆栈视图向其相关的超级视图添加顶部,左侧,右侧,底部,中心X和中心Y约束

确保将约束从堆栈视图链接到正确的超级视图(scrollview),因为当前的默认设置是添加“对齐顶部”约束而不是“顶部空间”约束。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.