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

上記のコード例では、実際にviewDidLoad()でタップジェスチャ認識機能を初期化する必要があるようです。そこにはコメントがありますが、どこに作成されているレコグナイザは表示されません。

スウィフト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)  
    } 
} 

スウィフト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:" sliderTrack: "はXcode 8.2.1では有効ではなくなりました。私はXcodeが私に与えた提案を試みたが、まだ失敗している。他の誰かがそれを理解しましたか? –

9

それはちょうどUISliderをサブクラス化し、所望の効果を生み出すbeginTrackingに常にtrueを返すように思えます。

iOSの10とスウィフト3

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

は、あなたのコード内で、その後の代わりUISliderのCustomSliderを使用してください。

+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を」、発射されたスライダーのサムをスライディングので、私は追加それを避けるための最小距離フィルタ。

スウィフト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

関連する問題