Обходной путь для ошибки UISlider, представленной в 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, а не на симуляторе, а я с айфоном вообще не пробовал).
Что происходит сейчас: после изменения изображения оно выглядит просто отлично, но область отслеживания, которая позволяет пользователю скользить по нему, все еще остается маленькой из встроенного изображения исходного слайдера. Это абсолютно раздражает с точки зрения пользователей.
Что я уже пробовал:
Подклассы и переопределение thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, значение: Float) -> CGRect. К сожалению, после отладки я обнаружил, что метод возвращает правильный новый CGRect, поэтому изменение его не имеет никакого эффекта.
Переопределение touchSign Начал оценивать, где ползунок видит событие касания, поэтому в качестве возможного обходного пути я мог бы начать отслеживание вручную. Но касания Бегана ясно показали, что событие касания было получено только на небольшой области, которая принадлежала исходному изображению.
Любая идея о другом возможном обходном пути, прежде чем я просто начну писать свой собственный класс слайдера с нуля, будет приветствоваться.
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
}