UISlider 导致水平滚动
UISlider causing horizontal scrolling
我有一个简单的屏幕,其中有一个滑块和一个水平相邻的标签。我将它们嵌入到 UIScrollView
中(我将其设置为填满屏幕并使用 'Add missing constraints'),因为稍后我需要垂直滚动。但是,我不想要水平滚动。我在这里和其他来源看到很多关于人们想要禁用水平滚动的帖子,但是我不确定那是我想要做的,我想我需要限制 UISlider
导致水平滚动;我认为它试图占用比屏幕更多的宽度。我添加了我认为必要的水平约束:
- 将 space 引导至
UISlider
的容器
- 水平间距为
UILabel
,
- 尾随 space 到
UILabel
的容器
但这仍然会导致水平滚动,原因是 UISlider
,它们占用的空间比我想要的要多,如下所示:
我尝试使用一些技术在代码中禁用水平滚动,其中之一是:
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.x>0 {
scrollView.contentOffset.x = 0
}
}
但这似乎并没有停止水平滚动。
谁能提供一些建议?
提前致谢。
只需将 UIScrollView
中的所有视图嵌入 UIView
中,为其提供所需的约束,然后滑块和标签将保留。
刚才对我有用。
我的建议是永远不要使用添加缺失的约束。它永远不会做你真正想要的。
问题来了。您正在将 UI 布置在正方形情节提要中的 ViewController
上。 Apple 这样做是为了提醒您,您需要在设计上保持灵活性,但它与 any 设备的尺寸不匹配。当您添加缺少的约束 时,它使用该正方形的绝对尺寸来创建肯定是错误的约束。
在您的具体情况下,滑块的宽度太宽,这就是滑块超出屏幕右侧的原因。
这是关于滚动视图的技巧。如果滚动视图中的内容比滚动视图本身宽,那么该内容将滚动。垂直方向也是如此:如果滚动视图中的内容比滚动视图高,则内容将滚动。
为了将其设计为适用于所有 phone,您需要确保滚动视图的内容针对每个 phone 尺寸正确布局。这当然意味着您不想为标签和滑块都使用特定的宽度,因为对于某些设备(如果不是全部),您最终会得到错误的宽度。
最好的方法是:
- 拖出滚动视图并将其添加到您的 ViewController。添加约束以确保它在所有 phone 上的大小合适,例如以固定距离将它的所有边附加到它的父视图。
- 拖出一个新的
UIView
并将其放在滚动视图上。拖动它的边缘,直到它与滚动视图的大小完全匹配。这将是您的内容视图。将此内容视图的所有四个边缘固定到滚动视图,偏移量为 0
.
这是一个棘手的问题。即使您已将内容视图固定到滚动视图,它的大小也可以自由增长,因为这允许它比滚动视图本身更大,并允许有内容滚动。为了防止滚动视图水平滚动,您需要确保内容视图与所有设备上的滚动视图具有相同的宽度。为此,请在 Storyboard 左侧的 Document Outline 中找到滚动视图和内容视图。 Control-从内容视图拖动到滚动视图,然后从弹出窗口select等宽。
您还没有告诉您的内容视图它应该有多高。现在,给它一个明确的高度限制 1000
。这足以滚动。
- 现在,将您的标签和滑块添加到内容视图。除了将它们相互约束并约束到内容视图的边缘之外,您还需要为标签设置宽度约束。然后 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的自动布局理解起来比较迷茫和复杂,但是如果你克服了这个问题,其他的自动布局问题就迎刃而解了。
我有一个简单的屏幕,其中有一个滑块和一个水平相邻的标签。我将它们嵌入到 UIScrollView
中(我将其设置为填满屏幕并使用 'Add missing constraints'),因为稍后我需要垂直滚动。但是,我不想要水平滚动。我在这里和其他来源看到很多关于人们想要禁用水平滚动的帖子,但是我不确定那是我想要做的,我想我需要限制 UISlider
导致水平滚动;我认为它试图占用比屏幕更多的宽度。我添加了我认为必要的水平约束:
- 将 space 引导至
UISlider
的容器
- 水平间距为
UILabel
, - 尾随 space 到
UILabel
的容器
但这仍然会导致水平滚动,原因是 UISlider
,它们占用的空间比我想要的要多,如下所示:
我尝试使用一些技术在代码中禁用水平滚动,其中之一是:
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.x>0 {
scrollView.contentOffset.x = 0
}
}
但这似乎并没有停止水平滚动。
谁能提供一些建议?
提前致谢。
只需将 UIScrollView
中的所有视图嵌入 UIView
中,为其提供所需的约束,然后滑块和标签将保留。
刚才对我有用。
我的建议是永远不要使用添加缺失的约束。它永远不会做你真正想要的。
问题来了。您正在将 UI 布置在正方形情节提要中的 ViewController
上。 Apple 这样做是为了提醒您,您需要在设计上保持灵活性,但它与 any 设备的尺寸不匹配。当您添加缺少的约束 时,它使用该正方形的绝对尺寸来创建肯定是错误的约束。
在您的具体情况下,滑块的宽度太宽,这就是滑块超出屏幕右侧的原因。
这是关于滚动视图的技巧。如果滚动视图中的内容比滚动视图本身宽,那么该内容将滚动。垂直方向也是如此:如果滚动视图中的内容比滚动视图高,则内容将滚动。
为了将其设计为适用于所有 phone,您需要确保滚动视图的内容针对每个 phone 尺寸正确布局。这当然意味着您不想为标签和滑块都使用特定的宽度,因为对于某些设备(如果不是全部),您最终会得到错误的宽度。
最好的方法是:
- 拖出滚动视图并将其添加到您的 ViewController。添加约束以确保它在所有 phone 上的大小合适,例如以固定距离将它的所有边附加到它的父视图。
- 拖出一个新的
UIView
并将其放在滚动视图上。拖动它的边缘,直到它与滚动视图的大小完全匹配。这将是您的内容视图。将此内容视图的所有四个边缘固定到滚动视图,偏移量为0
. 这是一个棘手的问题。即使您已将内容视图固定到滚动视图,它的大小也可以自由增长,因为这允许它比滚动视图本身更大,并允许有内容滚动。为了防止滚动视图水平滚动,您需要确保内容视图与所有设备上的滚动视图具有相同的宽度。为此,请在 Storyboard 左侧的 Document Outline 中找到滚动视图和内容视图。 Control-从内容视图拖动到滚动视图,然后从弹出窗口select等宽。
您还没有告诉您的内容视图它应该有多高。现在,给它一个明确的高度限制
1000
。这足以滚动。- 现在,将您的标签和滑块添加到内容视图。除了将它们相互约束并约束到内容视图的边缘之外,您还需要为标签设置宽度约束。然后 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的自动布局理解起来比较迷茫和复杂,但是如果你克服了这个问题,其他的自动布局问题就迎刃而解了。