11

Ich habe einen Slider erstellt (als Steuerelement des Videos, wie YouTube unten hat) und legen Sie die maximale (Dauer) und minimale Werte. Und dann SeekToTime verwendet, um die currentTime zu ändern. Jetzt kann der Benutzer den Schieberegler bewegen, um den Wert zu ändern.Tippen Sie auf UISlider, um den Wert festzulegen

Was ich erreichen möchte ist, den Benutzer irgendwo auf dem Schieberegler tippen und die aktuelle Uhrzeit des Videos einstellen.

bekam ich einen Ansatz von this answer, und ich versuchte, es zu meinem Fall zu bewerben, aber konnte es nicht

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)  
} 
} 

ich diese Arbeit sollte gedacht funktioniert, aber kein Glück. Dann habe ich versucht zu debuggen mit dem Versuch, "A" zu loggen, aber es geht nicht so offensichtlich nicht in die sliderTapped() Funktion.

Was mache ich falsch? Oder gibt es einen besseren Weg, um das zu erreichen, was ich erreichen möchte?

+1

vergaßen Sie den Delegaten des Gestenerkenner gesetzt? – whatever0010011

Antwort

20

Sieht so aus, als müssten Sie den Erkenner der Tippgeste in Ihrem viewDidLoad() tatsächlich initialisieren, wie im obigen Codebeispiel. Da ist ein Kommentar, aber ich sehe den Erkenner nirgendwo.

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

Vielen Dank Mann !!! Funktioniert wie Charme !! – senty

+0

Diese Antwort funktioniert so viel besser als alle anderen, die ich gefunden habe! Vielen Dank! – kenjikato

+0

Die Erstellung des 'action:" sliderTapped: "' ist in Xcode 8.2.1 nicht mehr gültig. Ich habe den Vorschlag, den Xcode mir gegeben hat, ausprobiert, aber es scheitert immer noch. Hat jemand anders es herausgefunden? –

9

Es scheint wie UISlider nur Subklassen und immer getreu dem beginTracking die gewünschte Wirkung zurück.

iOS 10 und Swift 3

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

Verwenden Sie die CustomSlider statt UISlider später in Ihrem Code.

+0

Dies ist die richtige Antwort !! Vielen Dank. –

+0

Gute Antwort, kurz und einfach – SPatel

0

pteofil's Antwort sollte hier die akzeptierte Antwort sein.

Im Folgenden finden Sie die Lösung für Xamarin für jedermann interessiert:

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

Wie pteofil erwähnt, müssen Sie die UISlider für diese zu arbeiten, Unterklasse.

+0

Was ist neu in Ihrer Antwort? –

1

Dies ist mein Code, basierend auf der Antwort "myuiviews".
Ich reparierte 2 kleine "Bugs" des ursprünglichen Codes.

1 - auf 0 Tapping zu schwierig war, so habe ich es leichter
2 - Schieben des Daumens Schieber nur ein wenig auch die „tapGestureRecognizer“ feuert, die es in die Ausgangsposition zurückkehren lassen, so dass ich hinzugefügt ein Mindestabstand Filter, um das zu vermeiden.

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

Ich habe eine kleine Änderung für die newValue-Berechnung vorgenommen, um den Mindestwert des Schiebereglers zu berücksichtigen, wenn er nicht Null ist. 'code'newValue = (((pointTapped.x - positionOfSlider.x) * CGFloat (self.offerSliderView.maximumValue - self.offerSliderView.minimumValue)/widthOfSlider) + CGFloat (self.offerSliderView.minimumValue))' code ' – jpmastermind