UISlider导致水平滚动

时间:2016-06-05 16:02:16

标签: ios swift autolayout uilabel uislider

我有一个简单的屏幕,滑块和标签水平放置在一起。我已经在UIScrollView中嵌入了这些(我将其设置为填充屏幕并使用“添加缺失约束”),因为我需要稍后垂直滚动。但是,我不想要水平滚动。我在这里看过很多关于人们想要禁用水平滚动的帖子,但是我不确定这是我想做什么,我想我需要限制UISlider导致水平滚动;我认为它试图占据比屏幕更宽的空间。我添加了我认为必要的水平约束:

  • 将空间引导至UISlider
  • 的容器
  • UILabel
  • 的水平间距
  • UILabel
  • 的容器尾随空格

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

Constraints on the UISlider and UILabel

What it looks like in the simulator

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

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

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

有人可以提出任何建议吗?

提前致谢。

3 个答案:

答案 0 :(得分:0)

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

这对我来说很有用。

答案 1 :(得分:0)

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

这是问题所在。您正在故事板中的ViewController上布置您的用户界面。 Apple这样做是为了提醒您,您需要灵活设计,但它与任何设备的大小不一致。当你添加缺失约束时,它使用该方块的绝对尺寸来创建肯定是错误的约束。

在您的特定情况下,滑块的宽度过宽,这就是滑块偏离屏幕右侧的原因。

这是关于滚动视图的技巧。如果滚动视图内的内容比滚动视图本身宽,则该内容将滚动。这同样适用于垂直:如果滚动视图内的内容高于滚动视图,则内容将滚动。

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

最好的方法是:

  1. 拖出滚动视图并将其添加到ViewController。添加约束以确保它在所有手机上都适当调整大小,例如将其连接到其超视图的所有侧面并保持固定距离。
  2. 拖出一个新的UIView并将其放在滚动视图上。拖动其边缘,直到它与滚动视图的大小完全匹配。这将是您的内容视图。将此内容视图的所有四个边都固定到滚动视图,偏移量为0
  3. 这是一个棘手的问题。即使您已将内容视图固定到滚动视图,它的大小也可以自由增长,因为这样可以让它比滚动视图本身更大,并允许滚动内容。要防止滚动视图水平滚动,您需要确保内容视图的宽度与所有设备上的滚动视图相同。为此,请在故事板左侧的文档大纲中找到滚动视图和内容视图。 控制 -drag从内容视图到滚动视图,然后从弹出窗口中选择 Equal Widths

    Control-drag in Document Outline view

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

  5. 现在,将标签和滑块添加到内容视图中。除了将它们彼此约束以及与内容视图的边缘约束之外,还需要为标签指定宽度约束。然后自动布局将获得计算滑块宽度所需的所有信息。 自动布局知道内容视图的宽度(在不同设备上会有所不同),它知道您的标签有多宽,以及所有内容与其他所有内容的距离,因此它只会拉伸滑块填补其余部分。
  6. 如果您执行所有这些操作,您将拥有一个适合所有方向的垂直滚动的UI尺寸。

答案 2 :(得分:0)

UIScrollView是特别的,如果你想使用AutoLayout,子视图不能直接添加,它需要一个容器视图来约束UIScrollView的contentSize,Auto Layout Guide:Working with Scroll Views解释详细原因,你可以找到很多解决方案在Google上解决UIScrollView的自动布局,例如answer

说实话,理解UIScrollView的自动布局会让人感到困惑和复杂,但如果你克服了这个问题,其他人的自动布局问题很容易解决。

相关问题