[iOS][Swift]UISliderで押し始めと指を離した時点を知る

UISliderを使う際には、ユーザーアクションによる値の変化を知るには、たいていvalueChangedで間に合います。しかしながら、ときには、押し始めとツマミを離した時点を知りたいことがあります。


UISliderのisContinuousプロパティをtrueにした場合はユーザーがツマミを操作した際に連続的にeventが呼ばれます。押し始めで呼ばれ、動かしている際にも連続的に呼ばれます。
isContinuousプロパティをfalseにした場合はユーザーがツマミを離した時点でeventが呼ばれます。

今回は、isContinuousプロパティをfalseにした上で、押し始めとツマミを離した時点でeventを受けとるやりかたを紹介します。
isContinuousプロパティがfalseなので、valueChangedでは、押し始めはわかりません。
UISliderは、UIControlを継承していますので、他にもユーザーアクションeventを受け取ることができます。
UIControl.Event | Apple Developer Documentation
UIControl – iPhoneアプリ開発の虎の巻

Connections inspectorで使用できるEventが示され、接続できます

実装

UISliderをStoryboardのViewControlerに貼り付けます。

UISliderを適当な場所に貼り付けます

今回は、スライダーのisContinuousプロパティをfalseとします。Attributes inspectorでContinuous Updatesのチェックを外すことで、isCoutinuousプロパティをfalseにできます。

touchDownを実装して押し始めを受け取ります。
Storyboard上のスライダーとViewController.swiftをActionで結びます。

そのさい、Touch Downを選びます。
NameはsliderDidTouchDownとしました。
これで、スライダーのツマミの押し始めに、sliderDidTouchDownが呼ばれます。

また、スライダーとViewController.swiftをActionのValue Changedで結びます。

こちらは、スライダーとViewController.swiftをActionで結ぶときデフォルトで表示される動作です。
NameをsliderValueChangedとしました。
今回は、スライダーのisContinuousプロパティをfalseとしているので、ツマミを動かし終えて指を離した時にeventが送信され受け取ることができます。

import UIKit

class ViewController: UIViewController {
    
    var nowTouching = false
    
    // (略)
    
    
    @IBAction func sliderDidTouchDown(_ sender: Any) {
        print("touch down")
        nowTouching = true
    }
    
    @IBAction func sliderValueChanged(_ sender: UISlider) {
        print("value changed")
        nowTouching = false
    }
}

スライダー操作したさいに、どこでeventが送られ受け取るのかを確認するために、printを記しました。実行すると、ツマミに触った時点で「touch down」とツマミから指を離した時点で「value changed」とコンソールに表示されます。
また、ViewController.swiftのプロパティとしてnowTouchingを加えました。
ツマミに触った時点でnowTouchingをtrue、ツマミから指を離した時点でfalseとしています。これによって、スライダーを触っている最中かどうかを判定できます。


今回は、スライダーのisContinuousプロパティをfalseとして作成しました。
isContinuousプロパティをtrueにした場合は、ツマミに触れた時点でValue changedイベントが送信され、ツマミを移動しているあいだ連続的にValue changedイベントが送信されます。このときツマミから指を離したのを検知するには、Touch Up Inside、Touch Up Outsideイベントを用いてください。




コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください