XCode 8 Beta 6 中引入的 UISlider 错误的解决方法?
Workaround for UISlider bug introduced in XCode 8 Beta 6?
我正在将一些代码迁移到 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)。
现在的情况: 换了图片后,看起来还不错,但是允许用户滑动的tracking area还是小了来自原始滑块的内置图像。从用户的角度来看,这绝对令人讨厌。
到目前为止我尝试过的:
Subclassing 和覆盖 thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect。可悲的是,经过调试,我发现该方法返回了正确的新CGRect,因此更改它没有效果。
覆盖 touchesBegan 以评估滑块在哪里看到触摸事件,因此作为一种可能的解决方法,我可以手动启动跟踪。但是touchesBegan却清楚地显示触摸事件只在属于原始图像的小区域接收到。
在我从头开始编写自己的滑块 class 之前,欢迎提出任何关于不同可能解决方法的想法。
子类和 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
}
我正在将一些代码迁移到 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)。
现在的情况: 换了图片后,看起来还不错,但是允许用户滑动的tracking area还是小了来自原始滑块的内置图像。从用户的角度来看,这绝对令人讨厌。
到目前为止我尝试过的:
Subclassing 和覆盖 thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect。可悲的是,经过调试,我发现该方法返回了正确的新CGRect,因此更改它没有效果。
覆盖 touchesBegan 以评估滑块在哪里看到触摸事件,因此作为一种可能的解决方法,我可以手动启动跟踪。但是touchesBegan却清楚地显示触摸事件只在属于原始图像的小区域接收到。
在我从头开始编写自己的滑块 class 之前,欢迎提出任何关于不同可能解决方法的想法。
子类和 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
}