UISlider Tracking Callout выровнен по большому пальцу - PullRequest
0 голосов
/ 06 октября 2018

У меня есть uislider с пузырем выноски, центр X которого следует над центром X большого пальца uislider.

Я проверил его на iPhone 7, и он отлично работает, и он такжеотлично работает на других устройствах после перемещения большого пальца.

У меня проблема в том, что при начальной загрузке пузырь и большой палец должны быть выровнены, как при перемещении большого пальца, но на устройстве, таком как iPhone8+ или iPhone SE, центр пузыря x смещен от центра большого пальца x (+/- 20 пунктов).

Я считаю, что расчет для выравнивания двух объектов является правильным, поскольку он работает нормально, когдаВы фактически перемещаете большой палец, но что-то с начальным вычислением x большого пальца выключено.В некоторых журналах консоли X большого пальца изначально читается как 180 пунктов, но при касании первое значение на самом деле составляет 201 пункт.Затем пузырь настраивается соответствующим образом.

Я использую собственный подкласс uislider для градиентов и тому подобное, и это может потенциально повлиять на него (?), Но это сбивает с толку, как он все еще работает на ощупь.

Любая помощь будет принята.

On viewDidLoad (ведущее ограничение - безопасная область):

distanceSlider.setValue(Float(sliderValue), animated: false)

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

При изменении расстояния:

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

Удлинитель центра пальца X:

extension UISlider {
    var thumbCenterX: CGFloat {
        let trackRect = self.trackRect(forBounds: frame)
        let thumbRect = self.thumbRect(forBounds: bounds, trackRect: trackRect, value: value)
        return thumbRect.midX
    }
}

1 Ответ

0 голосов
/ 06 октября 2018

Попробуйте установить ниже строки в viewDidLayoutSubviews().Похоже, что вид с добавленным ползунком не правильно разметил его размер.

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

Почему вы используете пользовательское изображение и настраиваете его в соответствии со значением слайдера.Вы можете напрямую использовать

func setThumbImage(_ image: UIImage?, for state: UIControl.State) проверить справочную ссылку Apple Doc https://developer.apple.com/documentation/uikit/uislider/1621336-setthumbimage

...