2012-01-09 3 views
41

私のアプリでは、さまざまな値を変更するためにいくつかのUISliderインスタンスがあります。値は、スライダのすぐ隣に表示され、アプリの別の表示部分の3次元空間に表示されます。ユーザが継続的なUISliderでスライドを終了したことを確認しますか?

3次元の部分にはかなり重い計算が含まれていますが、現在はスライダの変更に合わせてライブ部分を更新することはできません。つまり、スライダーのcontinuousプロパティをNOに設定しなければならないことを意味します。したがって、スライダーの変更が終了したときにのみ更新が取得されます。

と表示されるのは、の値の更新を有効にすることをお勧めします。連続しているスライダー(リアルタイムで私のバリューラベルを更新することができる)を持つ方法はありますか?ユーザーがそれとやり取りを終えたら、何らかのメッセージを送信しますか?私の直感は、UISliderをサブクラス化し、touchesEnded:メソッドをオーバーライドすることです。それは実現可能ですか?

答えて

72

これは、単純なターゲット/アクションで行うことができます。

UIControlEventValueChangedイベントのターゲットとアクションを設定してから、UIControlEventTouchUpInsideイベントのターゲットとアクションを設定します。 continuousプロパティをYESに設定すると、スライダの値が変更されると値変更イベントが発生しますが、タッチアップ内部イベントはユーザーがコントロールを離したときにのみ発生します。

+0

どうもありがとうございました。それはまさに私が探していたものです。 – winsmith

+1

は、iOS7ではもう何も動作しません。 6はまだ機能しています。 – dklt

+1

@dklt http://bugreport.apple.com – Jasarien

15

また、ユーザーが指をコントロールから引き出してから持ち上げる場合は、UIControlEventTouchUpOutsideイベントを接続する必要があります。

16

私はタッチのプロパティを調べて、完全なIBActionヘッダーを使用しました。

これは、いくつか特別なコントロールが必要な人には有効ですが、コード側ではJasの方がはるかに簡単です。

- (IBAction)itemSlider:(UISlider *)itemSlider withEvent:(UIEvent*)e; 
{ 
    UITouch * touch = [e.allTouches anyObject]; 

    if(touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan) 
    { 
     //The user hasn't ended using the slider yet. 
    } 

} 

:スウィフト3でD

+0

は、両方のケースでうまく機能します。私は、イベントパラメータが送信されていることを知らないとは信じられません。 –

+0

@ alex-iこのメソッドを呼び出すべきとき??? – user2545330

+3

@ user2545330 'スライダーの値が変更されたとき、上記のメソッドを呼び出すでしょう。[スライダーaddTarget:@セレクター(itemSlider:withEvent :) forControlEvents:UIControlEventValueChanged];詳細:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html#//apple_ref/occ/instm/UIControl/addTarget:action:forControlEvents: –

4

@IBAction func sliderValueChanged(_ slider: UISlider, _ event: UIEvent) { 
    guard let touch = event.allTouches?.first, touch.phase != .ended else { 
     // ended 
     return 
    } 
    // not ended yet 
} 
関連する問題