Нажмите на UISliders, созданные программно - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь найти решение в Swift 4, как предложил Диого в Нажмите на UISlider, чтобы установить значение - на наборе программ UISlider, определенных программно, но я не могу сослаться на инсайдера UISlider на Selector.

В viewDidLoad () с 'ползунком', определенным как любой UISlider в коллекции UISlider, работающих внутри оператора For ...:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped(_: slider:)))
slider.addGestureRecognizer(tapGestureRecognizer)

Селектор:

@objc func sliderTapped(_ gestureRecognizer:UIGestureRecognizer, slider:UISlider) {

    let pointTapped: CGPoint = gestureRecognizer.location(in: assessView)        
    let positionOfSlider: CGPoint = slider.convert(slider.bounds.origin, to: assessView)
    let widthOfSlider: CGFloat = slider.bounds.size.width

    let moveDistance = sqrt(Double(pow(Double(pointTapped.x - positionOfSlider.x),2) + pow(Double(pointTapped.y - positionOfSlider.y),2)))

    var newValue: CGFloat
    if pointTapped.x < 10 {
        newValue = 0
    } else {
        newValue = (CGFloat(moveDistance) * CGFloat(slider.maximumValue) / widthOfSlider)
    }

    slider.setValue(Float(newValue), animated: true)
}

Кроме того, «слайдер» добавляется в подпредставление в разделе «ViewView »- это должно быть целью taprecogniser?

При распечатке «ползунка» в консоли указывается, что «ползунок» не инициализирован. Есть мысли о том, как с этим бороться?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

Обновите ваш селектор, чтобы он принимал только жест.Вы можете получить ползунок из жеста.

Вам также необходимо проверить состояние жеста.

Обновите настройки:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped))
slider.addGestureRecognizer(tapGestureRecognizer)

Затем обновите свой метод:

@objc func sliderTapped(_ gesture: UITapGestureRecognizer) {
    guard gesture.state == .ended else { return }
    guard let slider = gesture.view as? UISlider else { return }

    let pointTapped: CGPoint = gesture.location(in: assessView)        
    let positionOfSlider: CGPoint = slider.convert(slider.bounds.origin, to: assessView)
    let widthOfSlider: CGFloat = slider.bounds.size.width

    let moveDistance = sqrt(Double(pow(Double(pointTapped.x - positionOfSlider.x),2) + pow(Double(pointTapped.y - positionOfSlider.y),2)))

    var newValue: CGFloat
    if pointTapped.x < 10 {
        newValue = 0
    } else {
        newValue = (CGFloat(moveDistance) * CGFloat(slider.maximumValue) / widthOfSlider)
    }

    slider.setValue(Float(newValue), animated: true)
}
0 голосов
/ 15 мая 2018

Согласно документации UIGestureRecognizer ( здесь ):

Методы действия должны соответствовать одной из следующих подписей:

@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)

Если вы не добавляете тот же экземпляр распознавателя в другие представления, вы можете получить ползунок, открыв свойство view распознавателя.

...