将UIScrollView scrollIndicator定位到边缘,没有间距?

时间:2018-10-22 08:53:46

标签: ios swift uiscrollview scrollbar

ScrollView.scrollIndicatorInsets实际如何工作?

如果将所有insets都默认设置为0,并且进行了一些调试,则实际上您会发现滚动条在默认情况下并不完全位于底部或右侧。

ScrollView.scrollIndicatorInsets = UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0)

Example

如您所见,滚动条和滚动视图边缘之间有一些额外的间距。

有什么办法可以以编程方式将滚动条的左下角准确地放置在视图的左下角?我不想对任何东西进行硬编码,我希望它可以在任何东西上使用scrollview的大小和屏幕。

插图实际上指定了什么(是的,我知道它们为滚动条指定了一个矩形)? iOS滚动条是否使用默认的边距,我必须考虑到这一点?滚动条的图层视图上是否发光,因此间距吗?

编辑:

我通过非常规方法解决了这一问题,方法是从滚动条本身(subviews.last)访问UIView,并使用最小的尺寸(即厚度)。

1 个答案:

答案 0 :(得分:1)

快速检查显示,将滚动指示器的插入值设置为UIEdgeInsetsZero(默认值),将其从边缘放3点。

您可以尝试使用:

theScrollView.scrollIndicatorInsets = UIEdgeInsets.init(top: -3, left: -3, bottom: -3, right: -3)

应该将水平指示器与底部对齐,并与左右边缘齐平,将垂直指示器与右侧对齐,并与顶部和底部边缘齐平。

可能希望首先获取框架,因为它可能因设备/尺寸/ iOS版本而异。

编辑:

一些澄清说明...

scroll indicators是图像视图。您可以通过检查滚动视图的子视图(代码或使用“调试视图层次结构”)来找到它们。

默认插图(为零)将这些图像视图从滚动视图框架的边缘移了3点。

300 x 500滚动视图中,垂直指示器的原点是:

  x:294.5 y:3.0   with a width of 2.5
  294.5 + 2.5 == 297
  // 3-pts from the right edge, 3-pts from the top

并且水平指示器的原点是:

  x:3.0 y:494.5   with a height of 2.5
  494.5 + 2.5 == 497
  // 3-pts from the left edge, 3-pts from the bottom

因此,使用:

.scrollIndicatorInsets = UIEdgeInsets.init(top: -3, left: -3, bottom: -3, right: -3)

将原点移动到

  // vertical
  x:297.5 y:0.0   with a width of 2.5
  297.5 + 2.5 == 300
  // flush to top and right edges

  // horizontal
  x:0.0 y:497.5   with a height of 2.5
  497.5 + 2.5 == 500
  // flush to left and bottom edges

我认为将来可能会发生变化。随着使用小屏幕设备的人越来越少,Apple 可以将宽度/高度更改为3或3.5或其他值,而可以将默认插图从3更改为其他内容。这就是为什么我说过,您可能希望获取帧以获取正确的插入值,而不是将其硬编码为3

不过,奇怪的是,直到指示器框架被绘制到屏幕上(通过闪烁或实际滚动内容),它们的框架的高度(垂直指示器)设置为7点,宽度设置为7点( (水平)),并位于右下角。

因此,在500 x 300滚动视图框架中,指示器框架最初是:

  // vertical
  x:294.5 y:490.0 w:2.5 h:7.0
  // horizontal
  x:290.0 y:494.5 w:7.0 h:2.5

这仍然告诉您,它们距离边缘只有3点,但这还不是很清楚……而且,不能保证将来不会改变。

如果您真的想确保指标会到达您想要的位置,那么最好的选择是使用自定义视图而不是内置指标。