ios - 将 UIScrollView scrollIndicatorInsets 定位到边缘,没有间距?

标签 ios swift uiscrollview scrollbar

ScrollView.scrollIndicatorInsets 实际上是如何工作的?

如果将所有插入设置为默认值 0,并且进行一些调试,您实际上会发现滚动条默认情况下并不完全靠近底部或右边缘。

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

Example

正如您所看到的,滚动条和 ScrollView 边缘之间有一些额外的间距。

有什么方法可以通过编程将滚动条左下角精确地放置在 View 的左下角吗?我不想硬编码任何东西,我希望它可以在任何 ScrollView 大小和屏幕。

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

编辑:

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

最佳答案

快速检查显示,插入设置为 UIEdgeInsetsZero(默认)的滚动指示器将它们放置在距边缘 3 磅的位置。

您可以尝试使用:

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

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

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

编辑:

一些澄清说明...

滚动指示器是 ImageView 。您可以通过检查 ScrollView 的 subview (代码或使用调试 View 层次结构)来找到它们。

默认插入(零)将这些 ImageView 放置在距 ScrollView 框架边缘 3 分的位置。

对于300 x 500 ScrollView ,垂直指示器的原点是:

  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

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

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

因此,对于 500 x 300 ScrollView 框架,指示器框架最初为:

  // 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 分,但还不太清楚......再说一次,不能保证将来不会改变。

如果您确实希望确保指示器会出现在您想要的位置,那么最好的选择可能是使用自定义 View 而不是内置指示器。

关于ios - 将 UIScrollView scrollIndicatorInsets 定位到边缘,没有间距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52925547/

相关文章:

ios - 如何将数字添加到 NSURL?参数错误太多

swift - 私有(private) IBOutlets Swift

ios - iOS 中的有效负载数据是什么?

ios - 如何删除 ios 图表中的水平条形图边距/偏移?

ios - UIScrollView 页面宽度不等于 self.view 宽度

ios - 设置 UIScrollView 以在 3 个 View Controller 之间滑动

ios - 如何在 UINavigationController 中插入 UITableView

ios - Google Plus 登录 Apple 现在拒绝翻转到 Safari

ios - ScrollView 中的按钮被禁用 - iOS Swift

iphone - numberOfLines=2 的 UILabel 使用什么约束高度? (使用 [NSString sizeWithFont...])