UIScrollView的滚动内容大小歧义UIScrollView的滚动内容大小歧义(UIScrol

2019-05-08 19:35发布

研究员开发者,我有自动版式在界面生成器(Xcode的5 / iOS的7)的麻烦。 这是很基本的,重要的,所以我认为每个人都应该知道如何正确地工作。 如果这是在Xcode中的错误,这是一个至关重要的!

所以,每当我有一个视图层次结构,如这个,我遇到了麻烦:

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

所述的UIScrollView有固体的限制,例如,从每一个侧(没有问题)50像素。 然后我一个顶层空间约束添加到的UILabel(没问题)(和我甚至可以销高度/宽度的标签,改变不了什么,但应该是不必要的,由于该品牌的固有大小)

麻烦的开始,当我添加尾随约束到的UILabel:

例如,尾随空格键:上海华等于:25

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

A)可滚动内容大小歧义(滚动查看具有不明确的可滚动内容的高度/宽度)

B)错位视图(标签预期:X = -67实测值:X = 207

我做了这个小例子,在一个新新的项目,你可以下载和我附上截图。 正如你所看到的,Interface Builder中预计,标签到UIScrollView的边界(橙色虚线矩形)的坐在外面。 更新标签的与解决问题工具移动它那里帧。

请注意:如果你有一个UIView替代的UIScrollView,该行为是按预期(标签的框架是正确的,并根据约束)。 所以似乎要么是用的UIScrollView或我错过了什么重要的问题。

当我运行的应用程序,而不更新标签的框架通过IB的建议它被定位得很好,它的确切位置应该是与UIScrollView的是滚动的。 如果我不更新的帧标签是淡出人们的视线和的UIScrollView不滚动。

帮助我欧比旺·克诺比! 为什么暧昧布局? 为什么错位的看法?

你可以在这里下载示例项目和尝试,如果你能弄清楚是怎么回事: https://github.com/Wirsing84/AutoLayoutProblem

Answer 1:

注:在iOS上> 10.0,这没有经过测试; 因此该解决方案可能是在某些情况下不完全的。

所以,我只是以这种方式整理出来:

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

  2. 在该contentView设置上,下,左,右边界为0(从过程scrollView这是superView ); 还设置水平和垂直居中对齐 ;

成品

现在,您可以添加在您的所有意见contentViewcontentSize的的scrollView将与根据自动调整contentView

更新:

一些特殊情况由本公约所涵盖的视频被贴@Sergio在下面的意见。



Answer 2:

这个错误我花了一段时间来追查,起初我试图牵制了滚动的大小,但该错误消息明确表示“内容大小”。 我确信一切,我从滚动型的顶部针扎也被钉在底部。 这样的滚动型可以通过寻找所有对象和约束的高度计算其内容的高度。 这解决了模棱两可的内容高度,宽度是非常相似......最初我曾在滚动型中心的大多数事情X,但我不得不也钉住对象的滚动型的侧面。 我不喜欢这一点,因为iPhone6可能有一个更宽的屏幕,但它会删除“暧昧内容的宽度”的错误。



Answer 3:

它是我的自我回答问题答案的UIScrollView +中心观+ Ambigous滚动的内容大小+许多iPhone的尺寸 。

但它完全覆盖你的情况呢!

所以,这里是最简单的情况下,初始状态:

  1. 滚动型与0约束所有边缘
  2. 按钮居中水平和垂直 固定宽度和高度的限制
  3. 而且,当然- 恼人的警告 Has ambiguous scrollable content widthHas ambiguous scrollable content height

所有,我们要做的是:

  • 添加2个额外的约束,例如“0”用于拖拽和/或底部的空间我们认为(看例如在下面的截图)。

重要提示:你必须添加尾部和/或底部的限制。 不是“领导和顶” - 这不是作品!

你可以在我检查一下示例项目 ,该演示如何解决此问题。

PS

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

我不知道为什么它的工作原理和Xcode中如何检测其约束是更优先(因为我没有这些限制明确地设置优先级)。 如果有人解释一下,为什么它工作在下面的评论我应该心存感激。



Answer 4:

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

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

第二步是使UIScrollView约束。 我这样做是与顶部,底部,开头和结尾的约束它的父。

接下来,我添加了约束的容器UIScrollView和这里的问题开始的地方。 当你把同样的限制(顶部,底部,开头和结尾的)故事板给出了一个警告消息:

“有暧昧滚动内容宽度”和“有暧昧滚动内容高度”

与上述相同的约束继续,并且只需添加约束Equal HeightEqual WidthContainer查看相对于主视图 ,而不是你 UIScrollView 。 换句话说,容器视图的约束绑在UIScrollView的上海华。

之后,你就不会在你的故事板的警告,您可以继续添加约束你的子视图。



Answer 5:

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

你经常可以绕过通过加碱的UIView的滚动型为“内容视图”,因为他们提到,使其大小相同滚动视图,并在此内容来看,这些设置6个参数的警告。

正如你所看到的,你需要的总共6个参数! 这..一般情况下,你重复2个约束,但是这是为了避免这个故事板错误的方式。



Answer 6:

的iOS 12,夫特4

用最简单的方式autolayout

  1. 添加UIScrollView ,它的引脚0,0,0,0到上海华(或者你想要的大小)
  2. 添加UIView滚动型,用别针把它0,0,0,0对所有4个侧面和居中horizontallyvertically
  3. 在尺寸检查器中,改变bottomalign center Y的优先级为250。(对于水平滚动变更trailingalign center X
  4. 添加需要到这个视图中的所有意见。 不要忘记设置底部约束的最低视图。


Answer 7:

我知道我可能会迟到,但下一个解决方案来解决这类问题,无需额外的代码 ,只是用故事板:

为了您的内容视图,你需要为前/后/顶/底部空间的限制,以滚动型, 这是不会改变的内容视图框 ,如下所示:

当然,你需要为内容视图中创建附加的约束使滚动视图可以知道内容的大小。 例如一套固定的高度和中心x。

希望这可以帮助。



Answer 8:

看看这个真快,并就如何获得滚动视图工作点教程并带有自动布局完全滚动。 现在,这仍然是离开我困惑的唯一的事情就是滚动视图内容大小总是大于然后需要..

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/



Answer 9:

请看下图:在滚动视图垂直和水平的集中内容视图。 你有歧义的错误,总是加入到滚动视图从您的内容视图确保二是1).button尾随的空间来约束空间container.2)的截图被突出显示,

这些约束是指滚动,你可以有多少你的内容视图高度或宽度后滚动。

它可以帮助你。



Answer 10:

@Matteo戈比的答案是完美的,但对我来说,滚动视图不能滚动,我删除“ 居中对齐Y”,并添加“ 高度> = 1”,滚动视图将成为滚动



Answer 11:

对我来说,增加一个contentView并没有真正发挥作用的建议。 此外,它创建了一个开销由于添加的视图(虽然我不认为这是一个大问题)。 什么工作最适合我只是关掉的模糊性,检查我的scrollView 。 所以我认为这是简单的情况下,像我这样的还好一切都很好地铺设。 但请记住,如果其他约束你的scrollView突破,界面-Builder将不会发出警告任何更多。



Answer 12:

谁是挣扎的UIScrollView人们不只是滚动设置您的内容视图的底部约束与您上次查看的底部布局(这是你的内容视图内)。 不要忘记删除芯Y约束。

休息如上所定义的所有约束都相同。 滚动型只关心从它的内容视图获得最大高度,我们正在将其设置为最后一页的底部约束,它会自动滚动视图意味着将改变其内容偏移。

在我的情况下最后的观点是UILable没有线条的属性= 0(自动调整其高度取决于它的内容),所以它动态地增加uilable的高度,最终我们因为uilable的底部布局滚动面积的增加与我们的内容视图的底部对齐,这力量滚动型,以增加它的内容偏移。



Answer 13:

我解决了这样的问题对我的看法,通过使用“解决自动布局问题”>“添加缺少的约束”为选择的视

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

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

在附图中:拖尾,底部是尾部,UIScrollView中的底部



Answer 14:

我在YouTube上发了视频
滚动StackViews只使用在Xcode故事板

我认为2种场景可以在这里出现。

滚动视图内的视图 -

  1. 没有任何内在的内容大小(如UIView
  2. 确实有其自己的内在含量的大小(例如UIStackView

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

  1. 从顶部,左边,底部,右4个约束。

  2. 相等的宽度,以滚动型(停止水平滚动)

你不需要为它有自己内在的内容高度视图中的任何其他约束。


对于不具有任何内在的内容高度的意见,你需要添加一个高度约束。 该视图将滚动只有在高度约束超过了滚动的高度。



Answer 15:

使用内容查看( UView )作为内侧容器UIScrollView ,粘到边缘( topbottomtrailingleading )上海华(的UIScrollView )和contentView应当具有equalwidthequalheight至上海华。 这些都是制约因素。 和方法的调用:

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

解决的问题我。



Answer 16:

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

内容画面自由,并能具有添加到它相对于内容查看自己的约束所有子视图。

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

编程我添加它通过IBOutlet中链接到类和设置的UIScrollView的内容查看的内容查看。



Answer 17:

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

  1. 查看(上海华)
  2. 滚动型0,0,600,600
  3. 里面的UIView滚动型:0,0,600,600
  4. UIView的包含图像视图,标签

现在添加前导/尾随/顶部/底部了滚动(2)然后UIView的(3)。

选择查看(1)和景观(3)设置同样的身高和体重..其解决了我的问题。

我也做了视频,这将有助于:

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



Answer 18:

[XCode中7.2和为iOS 9.2测试]

什么抑制故事板错误和警告对我来说是设置滚动视图的固有大小和内容视图(在我的情况下,stackview)来占位符 。 此设置在故事板的尺寸检查发现。 和它说 - 设置一个设计时间,而在Interface Builder编辑固有内容大小只影响视图。 该视图将不会在运行时,这个内在的内容大小。

所以,我想我们是不是通过设置这个走错了。

注:在故事板,我已将滚动视图到上海华的所有边缘和stackview来滚动视图所有边缘。 在我的代码,我已经设置了translatesAutoresizingMaskIntoConstraints为假的滚动视图和stackview两者。 我还没有提到的内容大小。 当stackview动态增长,在故事板设置的约束确保堆栈是可滚动的。

其实,故事情节警告驾驶我疯了,我也不想事情居中水平或垂直只是为了抑制警告。



Answer 19:

如果有人让你在那里看到右侧滚动滚动条的行为,但内容不动,这一事实或许值得考虑:

您也可以使用滚动视图的内容和对象之间的约束滚动视图之外,以提供滚动视图内容的固定位置,使这些内容似乎漂浮在滚动视图。

这是从苹果公司的文件 。 例如,如果你不小心固定的顶部标签/按钮/图/ View来滚动区域(也许只是滚动视图?上面的标题或东西)外的视图,而不是内容查看,你会冻结的地方你的整个内容查看。



Answer 20:

正如在以前的答案中提到,你应该添加滚动视图中的自定义视图:

所有的子视图添加到内容视图。 在某些时候,你会看到一个滚动的内容观点有暧昧内容大小的警告,你应该选择的内容视图,然后单击“解决自动布局问题”按钮(在IB布局的右下角),然后选择“添加缺少的限制”选项。

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



Answer 21:

你只需要确保有一种方法,使约束的连续线从顶部到滚动视图的底部。 [-XXX]

在我的情况-水平滚动的滚动视图-我还需要添加宽度和高度约束滚动视图的每一个孩子,虽然苹果公司的技术说明不会告诉你这一点。



Answer 22:

设置视图控制器的(一个抱着的UIScrollView)尺寸在Interface Builder大小检查员自由曲面,所有应该工作。

在尺寸检查在Interface Builder为包含自由曲面的UIViewController设置



Answer 23:

斯威夫特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
}


Answer 24:

所有一个滚动视图内的子视图必须具有约束触摸滚动视图的所有边缘,因为其在文档中说明的那样,滚动视图的高度和宽度会自动在子视图的措施来计算,这意味着需要有尾随和宽度,顶部和底部的高度约束领先的约束。



Answer 25:

我认为这是从现在开始10秒的工作。 我观察它的XCode 7.3,并在其上做了一个视频。 点击这里:

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

所有你需要做的,一个子视图添加到UIScrollView使用相同的宽度和高度。 然后选择视图控制器和按Reset to suggested constraint 。 为了清楚的了解请查看视频。

谢谢



文章来源: UIScrollView Scrollable Content Size Ambiguity