XCode 8 Beta 6 中引入的 UISlider 错误的解决方法?
Posted
技术标签:
【中文标题】XCode 8 Beta 6 中引入的 UISlider 错误的解决方法?【英文标题】:Workaround for UISlider bug introduced in XCode 8 Beta 6? 【发布时间】:2016-08-24 16:09:51 【问题描述】:我正在将一些代码迁移到 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)。
现在发生了什么: 更改图像后,它看起来很好,但是允许用户滑动它的跟踪区域仍然是原始滑块内置的小区域图片。从用户的角度来看,这绝对令人讨厌。
到目前为止我所尝试的:
继承和覆盖 thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect。遗憾的是,经过调试,我发现该方法返回了正确的新CGRect,因此更改它没有效果。
覆盖 touchesBegan 以评估滑块看到触摸事件的位置,因此作为一种可能的解决方法,我可以手动启动跟踪。但是touchesBegan清楚地表明,触摸事件仅在属于原始图像的小区域上接收到。
在我从头开始编写自己的滑块类之前,任何关于不同可能解决方法的想法都将受到欢迎。
【问题讨论】:
您是否向 Apple 提交了错误报告? 顺便说一句for: UIControlState()
是错误的。你应该说for: .normal
。
是的,我做到了:错误 #27888877。但正好是一周前,所以我在这里寻求一个好主意:)。另外,就在同一天,我在开发者论坛上发布了类似的内容。
太好了,感谢您提供错误编号。如果我提交同样的东西,我将能够继续...... :)
所以,在我看来,一个明显的解决方法是继承 UISlider 并实现您自己的命中测试。你说“但 touchesBegan 清楚地表明触摸事件只在属于原始图像的小区域上收到”;这正是自定义命中测试可以解决的问题。
【参考方案1】:
子类和 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
【讨论】:
我不知道为什么这不是 UISlider 已经在做的事情;它当然应该是。另外,很抱歉,事实证明它不是单行的;我没有夸大其词的意思。 天哪,这不是虫子!我只是在一个全新的项目中尝试过这个,没有问题。问题只是您忘记增加滑块的高度以适应较大拇指的大小。 哇。但它在 X8 Beta 1 之前的版本中工作,但没有这样做。无论如何我都会尝试增加情节提要的大小,因为他们似乎已经改变了一些事情......你认为我应该放弃提交的错误报告吗? 我认为改变的只是他们不再弥补这个错误。而且我不认为这算作一个错误。您可以留下错误报告,但我打赌它会“按预期工作”回来。此外,我的“解决方法”仍然非常好,因为它可以在滑块范围之外实现可触摸性,这正是您所需要的。 :) 嗯,在过去,我的观点是滑块“可以自动调整到拇指图像”,所以我们不需要在代码中同时更改图像然后去更改大小故事板。由于我正在旋转幻灯片并通过代码移动它们,以便将所有内容与具有自定义图像的其他控件自对齐,这对开发环境来说是一个巨大的帮助。因此,我认为您的解决方法非常好,因为它让我们恢复了我们在 Beta 1 之前一直享受的“自动”行为。谢谢!以上是关于XCode 8 Beta 6 中引入的 UISlider 错误的解决方法?的主要内容,如果未能解决你的问题,请参考以下文章
在 xcode 8 beta 6 的 UITableView 中使用 indexPath.row 将无法编译
Xcode 8 beta 6 中的 performActionForShortcutItem