11

Создал слайдер (управляя видео, как у YouTube, внизу) и устанавливал максимальные (длительность) и минимальные значения. Затем используется SeekToTime, чтобы изменить currentTime. Теперь пользователь может скользить большим пальцем ползунка, чтобы изменить значениеНажмите на UISlider, чтобы установить значение

То, что я хочу достичь, позволяет пользователю нажимать в любом месте ползунка и устанавливать текущее время видео.

Я получил подход от this answer, и я попытался применить его к моему делу, но не мог заставить его работать

class ViewController: UIViewController, PlayerDelegate { 

var slider: UISlider! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Setup the slider 
} 

func sliderTapped(gestureRecognizer: UIGestureRecognizer) { 
    // print("A") 

    let pointTapped: CGPoint = gestureRecognizer.locationInView(self.view) 

    let positionOfSlider: CGPoint = slider.frame.origin 
    let widthOfSlider: CGFloat = slider.frame.size.width 
    let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue)/widthOfSlider) 

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

Я думал, что это должно работать, но не повезло. Затем я попробовал отладку с попыткой напечатать «A» до журналов, но, похоже, он не входит в функцию sliderTapped().

Что я делаю неправильно? Или есть лучший способ достичь того, чего я пытаюсь достичь?

+1

вы забыли установить делегат жест распознаватель? – whatever0010011

ответ

20

Похоже, вам нужно фактически инициализировать распознаватель жестов в вашем представленииDidLoad() для примера кода выше. Там есть комментарий, но я не вижу, как распознаватель создается где угодно.

Swift 2:

class ViewController: UIViewController { 

    var slider: UISlider! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the slider 

     // Add a gesture recognizer to the slider 
     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "sliderTapped:") 
     self.slider.addGestureRecognizer(tapGestureRecognizer) 
    } 

    func sliderTapped(gestureRecognizer: UIGestureRecognizer) { 
     // print("A") 

     let pointTapped: CGPoint = gestureRecognizer.locationInView(self.view) 

     let positionOfSlider: CGPoint = slider.frame.origin 
     let widthOfSlider: CGFloat = slider.frame.size.width 
     let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue)/widthOfSlider) 

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

Swift 3:

class ViewController: UIViewController { 

    var slider: UISlider! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the slider 

     // Add a gesture recognizer to the slider 
     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped(gestureRecognizer:))) 
     self.slider.addGestureRecognizer(tapGestureRecognizer) 
    } 

    func sliderTapped(gestureRecognizer: UIGestureRecognizer) { 
     // print("A") 

     let pointTapped: CGPoint = gestureRecognizer.location(in: self.view) 

     let positionOfSlider: CGPoint = slider.frame.origin 
     let widthOfSlider: CGFloat = slider.frame.size.width 
     let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue)/widthOfSlider) 

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

Спасибо большое! Работает как шарм !! – senty

+0

Этот ответ работает намного лучше, чем любой другой, который я нашел! Благодаря! – kenjikato

+0

создание слайдера «action:»: «' больше не действует в Xcode 8.2.1. Я попробовал предложение, которое Xcode дал мне, но он все еще не работает. Кто-нибудь еще понял это? –

9

Похоже, просто подклассов UISlider и возвращение всегда верны beginTracking получения желаемого эффекта.

IOS 10 и Swift 3

class CustomSlider: UISlider { 
    override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool { 
     return true 
    } 
} 

Используйте CustomSlider вместо UISlider потом в вашем коде.

+0

Это правильный ответ! Благодарю. –

+0

Хороший ответ, короткий и простой – SPatel

0

Ответ pteofil должен быть принят здесь.

Ниже приводится решение для Xamarin для всех интересует:

public override bool BeginTracking(UITouch uitouch, UIEvent uievent) 
{ 
    return true; 
} 

Как pteofil упоминалось, что вам нужно подкласс UISlider для этой работы.

+0

Что нового в вашем ответе? –

1

Это мой код, основанный на ответе «myuiviews».
Я исправил 2 маленьких «ошибки» исходного кода.

1 - Нажатие на 0 было слишком трудно, поэтому я сделал проще
2 - Скользящий палец слайдера чуть было также запуская «tapGestureRecognizer», что делает его вернуться в исходное положение, так что я добавил чтобы избежать этого.

Swift 4

class ViewController: UIViewController { 

    var slider: UISlider! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Setup the slider 

     // Add a gesture recognizer to the slider 
     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped(gestureRecognizer:))) 
     self.slider.addGestureRecognizer(tapGestureRecognizer) 
    } 

    @objc func sliderTapped(gestureRecognizer: UIGestureRecognizer) { 
     // print("A") 

     var pointTapped: CGPoint = gestureRecognizer.location(in: self.view) 
     pointTapped.x -= 30 //Subtract left constraint (distance of the slider's origin from "self.view" 

     let positionOfSlider: CGPoint = slider.frame.origin 
     let widthOfSlider: CGFloat = slider.frame.size.width 

     //If tap is too near from the slider thumb, cancel 
     let thumbPosition = CGFloat((slider.value/slider.maximumValue)) * widthOfSlider 
     let dif = abs(pointTapped.x - thumbPosition) 
     let minDistance: CGFloat = 51.0 //You can calibrate this value, but I think this is the maximum distance that tap is recognized 
     if dif < minDistance { 
      print("tap too near") 
      return 
     } 

     var newValue: CGFloat 
     if pointTapped.x < 10 { 
      newValue = 0 //Easier to set slider to 0 
     } else { 
      newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue)/widthOfSlider) 
     } 



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

Я сделал небольшое изменение для вычисления newValue, чтобы обеспечить минимальное значение ползунка, когда оно не равно нулю. 'code'newValue = (((pointTapped.x - positionOfSlider.x) * CGFloat (self.offerSliderView.maximumValue - self.offerSliderView.minimumValue)/widthOfSlider) + CGFloat (self.offerSliderView.minimumValue))' code ' – jpmastermind

 Смежные вопросы

  • Нет связанных вопросов^_^