2

我正在将一些代码迁移到 XCode 8 Beta 6,在 XCode 8 Beta 1 之前运行良好(它之前是从 7.3 迁移的)。一切正常,除了在使用大于原始滑块内置的自定义拇指图像时滑块的新奇怪行为:

override func viewDidLoad() {
    super.viewDidLoad()
    sliderBuggy.setThumbImage(UIImage(named: "actionRobotDelay.png"), for: UIControlState())
}
  • 正确的行为:在 Beta 6 之前,一旦我设置了新的拇指图像,跟踪区域就会自动调整,用户可以从图像内的任何点滑动它(注意:我在真正的 iPad mini 上进行测试,而不是模拟器,我根本没有尝试使用 iPhone)。

  • 现在发生了什么:更改图像后,它看起来很好,但是允许用户滑动它的跟踪区域仍然是原始滑块内置图像中的一小部分。从用户的角度来看,这绝对令人讨厌。

到目前为止我已经尝试过:

  1. 子类化和覆盖 thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect. 可悲的是,经过调试,我发现该方法返回了正确的新CGRect,因此更改它没有效果。

  2. 覆盖 touchesBegan 以评估滑块看到触摸事件的位置,因此作为一种可能的解决方法,我可以手动启动跟踪。但是 touchesBegan 清楚地表明,触摸事件仅在属于原始图像的小区域上接收到。

在我从头开始编写自己的滑块类之前,任何关于不同可能解决方法的想法都将受到欢迎。

4

1 回答 1

4

子类和 munge 命中测试来做滑块应该做的事情(谁知道它为什么不做呢?):

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let tr = self.trackRect(forBounds: self.bounds)
    if tr.contains(point) { return self }
    let r = self.thumbRect(forBounds: self.bounds, trackRect: tr, value: self.value)
    if r.contains(point) { return self }
    return nil
}
于 2016-08-24T16:29:26.523 回答