У меня есть кнопка, которую я нажимаю, и появляется пользовательское предупреждение с normal UISlider внутри него.У меня есть некоторые другие виды и метки, которые показывают расстояние и т. Д., Которые находятся выше и позади слайдера.Что происходит, так это то, что thumbRect слайдера не скользит хорошо при прикосновении.Я должен быть очень точным, когда пытаюсь сдвинуть его, и он кажется глючным.То, что я хочу сделать, это добавить чистый UIView перед ним (и другие виды и надписи над ним) и сделать так, чтобы чистый UIView управлял ползунком, используя UIGestureRecognizer
.
Вот настройки до сих пор.ClearView - это то, что я хочу использовать для управления слайдером.Прямо сейчас это позади всего и Я покрасил clearView в красный цвет, чтобы он был виден для примера
bgView.addSubview(slider) // slider added to bgView
let trackRect = slider.trackRect(forBounds: slider.frame)
let thumbRect = slider.thumbRect(forBounds: slider.bounds, trackRect: trackRect, value: slider.value)
milesLabel.center = CGPoint(x: thumbRect.midX, y: slider.frame.origin.y - 55)
bg.addSubview(milesLabel) // milesLabel added to bgView
// ** all the other views you see are added to the bgView and aligned with the thumbRect's center **
let milesLabelRect = bgView.convert(milesLabel.frame, to: self.view)
let sliderRect = bgView.convert(slider.frame, to: self.view)
let topOfMilesLabel = milesLabelRect.origin.y
let bottomOfSlider = sliderRect.maxY
let distance = bottomOfSlider - topOfMilesLabel
clearView.frame = CGRect(x: milesLabel.frame.minX, y: milesLabel.frame.minY, width: milesLabel.frame.width, height: distance)
bgView.addSubview(clearView) // clearView added to bgView
bgView.insertSubview(clearView, at: 0)
Когда ясдвиньте ползунок, все успешно скользит вместе с ним, включая clearView, но, конечно, thumbRect
все еще контролирует все.
@objc func onSliderValChanged(sender: UISlider, event: UIEvent) {
slider.value = round(sender.value)
UIView.animate(withDuration: 0.25, animations: {
self.slider.layoutIfNeeded()
let trackRect = sender.trackRect(forBounds: sender.frame)
let thumbRect = sender.thumbRect(forBounds: sender.bounds, trackRect: trackRect, value: sender.value)
self.milesLabel.center = CGPoint(x: thumbRect.midX, y: sender.frame.origin.y - 55)
// ** all the other views are aligned with the thumbRect's center as it slides **
self.clearView.frame.origin = self.milesLabel.frame.origin
})
}
Идея состоит в том, чтобы переместить clearView на передний план и использовать его для управления большим пальцем (не забывайте, что для примера только красный).
bgView.bringSubviewToFront(clearView)
// clearView.backgroundColor = UIColor.clear
Я пытался использовать UIPanGesture
и UILongPressGestureRecognizer
, чтобы clearView управлял ползунком, но когда я сдвигаю ползунок только ползунки thumbRect, clearView остается неподвижным.Посмотрите, где находится clearView (красный), и посмотрите, где находится thumbRect
после того, как я сдвинул его до точки 10 миль.
// separately tried a UILongPressGestureRecognizer too
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(draggedView(_:)))
clearView.isUserInteractionEnabled = true
clearView.addGestureRecognizer(panGesture)
@objc func draggedView(_ sender: UIPanGestureRecognizer) {
if slider.isHighlighted { return }
let point = sender.location(in: slider)
let percentage = Float(point.x / slider.frame.width)
let delta = percentage * (slider.maximumValue - slider.minimumValue)
let value = slider.minimumValue + delta
slider.setValue(value, animated: true)
}
Если я поиграюсь с этим достаточно, clearView иногда скользит с помощью thumbRect, но они определенно не выровнены, и он очень глючит.Я также потерял контроль над всеми остальными видами, которые были выровнены с помощью thumbRect.
Как передать управление с ползунка бегунка в clearView?