默认行为UISlider
是它的拇指没有集中在轨道的开始/结束处。就像下面这样:
我想修改它的行为以获得:
拇指的中心可以位于起点或终点。
我试图用空来覆盖开始/结束UIView
。效果是看起来几乎没问题,但是拇指有阴影,显示了我在某些位置的黑客攻击(我可以忍受),但是我的hacky视图覆盖了一点拇指并捕获其触摸事件(即使用户交互被禁用)。
所以我想我需要打包我的hacky拇指和轨道之间的视图。可能无需操纵其内部观点。有任何想法吗?
UISlider类有一个方法拇指矩形(forBounds:trackRect:值:) https://developer.apple.com/documentation/uikit/uislider/1621344-thumbrect您可以覆盖它来控制滑块缩略图的绘制矩形。因此,假设该空间为 5 个点(可能会根据您使用的拇指图像而有所不同),我们可以执行以下操作:
- 子类
UISlider
并覆盖thumbRect(forBounds:trackRect:value:)
让我们自己融入这个过程
- 定义thumbSpace(我假设它是5),从thumbSpace我们可以计算起始偏移(滑块之前5个点)和结束偏移(滑块之后5个点)。
- 计算与当前值、minValue 和 maxValue 相关的拇指平移(换句话说,根据当前值,我们稍微移动拇指以覆盖我们不想显示的空间)
- 将移动的矩形(应用 x 平移后)返回给 super 方法以进行常规计算
完整的代码应该如下所示:
class CustomSlider: UISlider {
let defaultThumbSpace: Float = 5
lazy var startingOffset: Float = 0 - defaultThumbSpace
lazy var endingOffset: Float = 2 * defaultThumbSpace
override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
let xTranslation = startingOffset + (minimumValue + endingOffset) / maximumValue * value
return super.thumbRect(forBounds: bounds,
trackRect: rect.applying(CGAffineTransform(translationX: CGFloat(xTranslation),
y: 0)),
value: value)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)