ios - scrollview停止滚动




UIScrollView可滚动内容大小歧义 (16)

您只需确保有一种方法可以从滚动视图的顶部到底部制作一系列连续的约束条件。 [-XXX]

在我的情况下 - 一个水平滚动的滚动视图 - 我还需要为滚动视图的每个子项添加宽度和高度约束,尽管Apple的技术说明没有告诉你这一点。

各位开发者,我在Interface Builder(Xcode 5 / iOS 7)中遇到了AutoLayout问题。 这是非常基本和重要的,所以我认为每个人都应该知道这是否正常工作。 如果这是Xcode中的一个错误,那么这是一个关键问题!

所以,无论何时我有这样的视图层次结构,我都会遇到麻烦:

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

UIScrollView有严格的约束条件,例如,每边都有50 px(没问题)。 然后我向UILabel添加顶部空间约束(没问题)(我甚至可以固定标签的高度/宽度,不会改变任何内容,但由于标签的固有尺寸而不需要)

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

例如,拖尾空间:Superview等于:25

现在发生了两个警告 - 我不明白为什么:

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

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

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

请注意:如果用UIView替换UIScrollView,则行为与预期的一样(标签的框架是正确的并且根据约束)。 所以这似乎是UIScrollView的一个问题,或者我错过了一些重要的东西。

当我按照IB建议的方式运行应用程序而未更新标签的框架时,它定位得很好,确切地说它应该在哪里,UIScrollView是可滚动的。 如果我更新框架的标签是看不见的和UIScrollView不滚动。

帮助我Obi-Wan Kenobi! 为什么模糊的布局? 为什么错位观点?

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


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


iOS 11,Swift 4

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

  1. 添加UIScrollView并将其固定为超级查看(或您希望的大小)0,0,0,0
  2. 在ScrollView中添加UIView,将它固定到所有4条边并将其水平和垂直居中。
  3. 在尺寸检查员中,将“底部”和“对齐中心Y”的优先级更改为250。
  4. 将所需的所有视图添加到此视图中。 不要忘记在最低视图上设置底部约束。

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

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

在我的情况下,最后一个视图是UILable,没有行属性= 0(根据其内容自动调整其高度),因此它动态增加uilable的高度,最终我们的可滚动区域增加,因为uilable的底部布局与我们的内容视图的底部一致,这迫使scrollview增加它的内容偏移量。


在UIScrollView中使用contentView(UView)作为容器,坚持superview(UIScrollView)的边缘(顶部,底部,尾部,顶部),contentView的宽度和高度应等于超级视图。 这些都是限制。 和方法的调用:

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

解决了我的问题。


在scrollview中的所有子视图都必须具有触及滚动视图所有边的约束,如文档中所述,滚动视图的高度和宽度由子视图中的度量自动计算,这意味着您需要拥有高度的宽度和顶部和底部约束的尾随和主导约束。


如果有人发现您注意到右侧滚动条滚动但内容不移动的行为,这个事实可能值得考虑:

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

这来自Apple的documentation 。 例如,如果您不小心将顶部的Label / Button / Img / View固定在滚动区域之外的视图(可能是头部或scrollView上方的某个视图?)而不是contentView,则会冻结整个contentView。


对于我来说,添加一个contentView并不是真的按照建议工作。 而且,由于增加了视图,它会产生开销(尽管我不认为这是一个大问题)。 对我来说最合适的就是关闭对我的scrollView 的歧义检查 。 一切都很好,所以我认为在像我这样简单的情况下可以。 但请记住,如果您的scrollView其他约束中断,Interface-Builder将不会再提醒您。


我得到了同样的错误..我做了以下

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

现在为scrollView(2)和UIView(3)添加前导/尾随/顶部/底部。

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

我已经完成了可以帮助你的视频:

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


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

内容视图是自由形式的,并且可以通过与contentView相关的约束添加所有子视图。

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

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


我终于明白了这一点,我希望这更容易理解。

你必须像上面提到的那样将一个基本的UIView作为一个“内容视图”添加到滚动视图中,并使其与滚动视图的大小相同,并在此内容视图中设置这6个参数。

正如你所看到的,你需要6个参数! 其中......在正常情况下,您正在复制2个约束,但这是避免此故事板错误的方法。


我认为这是从现在开始的10秒钟的工作。 我在XCode 7.3中观察它并制作了一个视频。 检查这里:

https://www.youtube.com/watch?v=yETZKqdaPiI

所有你需要做的,添加一个子视图到UIScrollView具有相同的宽度和高度。 然后选择ViewController并按Reset to suggested constraint 。 请检查视频以获得清晰的理解。

谢谢


所以我就这样整理:

  1. UIScrollView 添加一个UIView (我们可以调用contentView );

  2. 在这个contentView将顶部,底部,左侧和右侧边距设置为0 (当然是从scrollViewsuperView ); 设置也水平和垂直对齐中心 ;

完成

现在,您可以在contentView添加所有视图,并且scrollViewcontentSize将根据contentView自动调整大小。

更新:

@Sergio在以下评论中张贴的video介绍了一些特殊情况。


正如前面的答案中所提到的,您应该在滚动视图中添加一个自定义视图:

将所有子视图添加到内容视图。 在某些情况下,您将看到滚动内容视图的内容大小不明确,您应该选择内容视图,然后单击“解决自动布局问题”按钮(在IB布局的右下角),然后选择“添加缺失约束“选项。

从现在起当你运行项目时,滚动视图会自动更新它的内容大小,不需要额外的代码。


请参阅以下内容:滚动视图中的内容视图垂直和水平集中。 你得到了模糊性错误,一定要确保从你的内容视图添加到滚动视图中的两个是1).button空间到容器.2)拖尾空间到在屏幕截图中突出显示的约束,

这些约束意味着滚动是你可以滚动多少内容视图的高度或宽度。

它可能会帮助你。


这个错误花了我一段时间来追查,最初我试图固定ScrollView的大小,但错误信息清楚地表明“内容大小”。 我确定我从ScrollView的顶部固定的所有东西都固定在底部。 这样ScrollView就可以通过查找所有对象和约束的高度来计算其内容高度。 这解决了含糊不清的内容高度,宽度非常相似......最初,我在ScrollView中拥有大部分事物X,但我还必须将对象固定到ScrollView的一侧。 我不喜欢这样做,因为iPhone6可能有更宽的屏幕,但它会消除'模棱两可的内容宽度'错误。







interface-builder