ios - UISlider 导致水平滚动

标签 ios swift autolayout uilabel uislider

我有一个简单的屏幕,其中有一个 slider 和一个水平相邻的标签。我已将它们嵌入到 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
    }
}

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

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

提前致谢。

最佳答案

我的建议是永远不要使用Add missing constraints。它永远不会做您真正想要的。

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

在您的特定情况下,它为 slider 提供的宽度太宽,这就是 slider 离开屏幕右侧的原因。

这是关于 ScrollView 的技巧。如果 ScrollView 中的内容比 ScrollView 本身宽,那么该内容将滚动。这同样适用于垂直方向:如果 ScrollView 中的内容高于 ScrollView ,则内容将滚动。

为了将其设计为适用于所有手机,您需要确保 ScrollView 的内容针对每种手机尺寸进行了正确布局。这当然意味着您不想为标签和 slider 都使用特定的宽度,因为对于某些设备(如果不是所有设备),您最终会得到错误的宽度。

最好的方法是:

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

    Control-drag in Document Outline view

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

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

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

关于ios - UISlider 导致水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643921/

相关文章:

ios - CloudKit 推送通知 didReceiveRemoteNotification 从未调用过

ios - 如何重置单例实例?

ios - 在 Swift 2.x 和 iOS9 中以编程方式关闭 searchBar

ios - 如何防止我的 UISplitViewController 在旋转到纵向时显示主 VC?

iphone - 在 Xcode 中使用 AutoLayout 会禁用我的代码(动态地)工作?

ios - Xcode 8 autolayout 毁了我的项目

ios - 如何设置 RadDataForm ListPicker 的选择器的样式

ios - 协议(protocol)在两个 UITbaleViewController 之间不起作用

ios - 如何在 iOS Swift 中向图像添加文本?

Swift UIAccessibility 可以知道之前关注的元素吗?