SwiftUI .gestureモディファイア(modifier)でスワイプ(swipe)の種類判断

DragGestureの位置情報から角度を計算、スワイプ(swipe)の種類を判断する。
計算と角度範囲は図を参照。

スワイプ(swipe)の種類
up:下から上
down:上から下
left:右から左
right:左から右

各方向60度範囲としたサンプルソース

:
    ExampleView()
        .gesture(DragGesture(coordinateSpace: .global)
            .onEnded({ value in
                let swipeType = self.swipeType(startLocation: value.startLocation,
                                                location: value.location)
                print("SwipeType:\(swipeType)")
            })
        )
:
    func swipeType(startLocation: CGPoint, location: CGPoint) -> SwipeType {
        var swipeType: SwipeType = .none
        print("startLocation:\(startLocation)")
        print("location     :\(location)")
        let b = startLocation.y - location.y
        let c = location.x - startLocation.x
        let degree = atan2(b, c) * 180 / Double.pi
        print("\(#function) b:\(b)")
        print("\(#function) c:\(c)")
        print("\(#function)  :\(degree)")
        if -30.0 <= degree && degree <= 30 {
            swipeType = .right
        }
        else if 60.0 <= degree && degree <= 120 {
            swipeType = .up
        }
        else if (150.0 <= degree && degree <= 180.0) ||
                    (-180 <= degree && degree <= -150.0) {
            swipeType = .left
        }
        else if -120.0 <= degree && degree <= -60.0 {
            swipeType = .down
        }
        return swipeType
    }
    
    enum SwipeType: Int {
        case none
        case up
        case down
        case left
        case right
    }
    

SwiftSwift,SwiftUI

Posted by shi-n