Обходной путь для ошибки 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, а не на симуляторе, а я с айфоном вообще не пробовал).

  • Что происходит сейчас: после изменения изображения оно выглядит просто отлично, но область отслеживания, которая позволяет пользователю скользить по нему, все еще остается маленькой из встроенного изображения исходного слайдера. Это абсолютно раздражает с точки зрения пользователей.

Что я уже пробовал:

  1. Подклассы и переопределение thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, значение: Float) -> CGRect. К сожалению, после отладки я обнаружил, что метод возвращает правильный новый CGRect, поэтому изменение его не имеет никакого эффекта.

  2. Переопределение 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
}
Другие вопросы по тегам