UISlider 导致水平滚动

UISlider causing horizontal scrolling

我有一个简单的屏幕,其中有一个滑块和一个水平相邻的标签。我将它们嵌入到 UIScrollView 中(我将其设置为填满屏幕并使用 'Add missing constraints'),因为稍后我需要垂直滚动。但是,我不想要水平滚动。我在这里和其他来源看到很多关于人们想要禁用水平滚动的帖子,但是我不确定那是我想要做的,我想我需要限制 UISlider 导致水平滚动;我认为它试图占用比屏幕更多的宽度。我添加了我认为必要的水平约束:

但这仍然会导致水平滚动,原因是 UISlider,它们占用的空间比我想要的要多,如下所示:

我尝试使用一些技术在代码中禁用水平滚动,其中之一是:

func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView.contentOffset.x>0 {
        scrollView.contentOffset.x = 0
    }
}

但这似乎并没有停止水平滚动。

谁能提供一些建议?

提前致谢。

只需将 UIScrollView 中的所有视图嵌入 UIView 中,为其提供所需的约束,然后滑块和标签将保留。

刚才对我有用。

我的建议是永远不要使用添加缺失的约束。它永远不会做你真正想要的。

问题来了。您正在将 UI 布置在正方形情节提要中的 ViewController 上。 Apple 这样做是为了提醒您,您需要在设计上保持灵活性,但它与 any 设备的尺寸不匹配。当您添加缺少的约束 时,它使用该正方形的绝对尺寸来创建肯定是错误的约束。

在您的具体情况下,滑块的宽度太宽,这就是滑块超出屏幕右侧的原因。

这是关于滚动视图的技巧。如果滚动视图中的内容比滚动视图本身宽,那么该内容将滚动。垂直方向也是如此:如果滚动视图中的内容比滚动视图高,则内容将滚动。

为了将其设计为适用于所有 phone,您需要确保滚动视图的内容针对每个 phone 尺寸正确布局。这当然意味着您不想为标签和滑块都使用特定的宽度,因为对于某些设备(如果不是全部),您最终会得到错误的宽度。

最好的方法是:

  1. 拖出滚动视图并将其添加到您的 ViewController。添加约束以确保它在所有 phone 上的大小合适,例如以固定距离将它的所有边附加到它的父视图。
  2. 拖出一个新的 UIView 并将其放在滚动视图上。拖动它的边缘,直到它与滚动视图的大小完全匹配。这将是您的内容视图。将此内容视图的所有四个边缘固定到滚动视图,偏移量为 0.
  3. 这是一个棘手的问题。即使您已将内容视图固定到滚动视图,它的大小也可以自由增长,因为这允许它比滚动视图本身更大,并允许有内容滚动。为了防止滚动视图水平滚动,您需要确保内容视图与所有设备上的滚动视图具有相同的宽度。为此,请在 Storyboard 左侧的 Document Outline 中找到滚动视图和内容视图。 Control-从内容视图拖动到滚动视图,然后从弹出窗口select等宽

  4. 您还没有告诉您的内容视图它应该有多高。现在,给它一个明确的高度限制 1000。这足以滚动。

  5. 现在,将您的标签和滑块添加到内容视图。除了将它们相互约束并约束到内容视图的边缘之外,您还需要为标签设置宽度约束。然后 Auto Layout 将拥有计算滑块宽度所需的所有信息。 Auto Layout 知道内容视图的宽度(在不同的设备上会有所不同),它知道您的标签的宽度,以及所有内容与其他内容的距离,因此它只会拉伸滑块以填充其余部分。

如果您完成所有这些操作,您将拥有一个 UI 大小适合所有垂直滚动方向的所有设备。

UIScrollView在使用AutoLayout时比较特殊,不能直接添加子视图,需要容器视图来约束UIScrollView的contentSize,Auto Layout Guide:Working with Scroll Views explains the detail reason, and you can find many solutions to solve UIScrollView's auto layout on Google, Such as this answer.

说实话,UIScrollView的自动布局理解起来比较迷茫和复杂,但是如果你克服了这个问题,其他的自动布局问题就迎刃而解了。