본문 바로가기

iOS

iOS 연속 탭 위치 인식 방법

728x90
반응형
SMALL

터치 이벤트가 발생할 경우 UIGestureRecognizer클래스를 상속받아 여러 정보를 받아올 수 있습니다.

 

그리고 안의 touchesBegan,touchesEnded 등의 메서드를 오버라이드 해서 다중 터치 이벤트를 처리할 수 있습니다.

(Set<UITouch>, 셋 자료 구조에 UITouch 객체를 담아서 하나 이상의 UITouch 객체를 포함할 수 있습니다.)

터치 정보

<UITouch: 0x15f2040c0>

phase: Began tap   현재 터치 이벤트의 단계를 의미합니다.

count: 1.                     해당 터치의 탭 수를 나타냅니다.

force: 0.000             해당 터치의 힘(강도)를 나타내며, Force Touch를 사용하는 디바이스에서만 유효합니다.

 

*** Force Touch ***

https://namu.wiki/w/Force%20Touch

 

Force Touch - 나무위키

  자세한 내용은 Taptic Engine 문서 를 참고하십시오. Force Touch의 개념은 안드로이드에도 있었다는 평이 있지만 그걸 실제로 만족스러운 사용성을 가지게 구현하는 것에는 큰 차이가 있다. Apple의 F

namu.wiki

 

 

window:              해당 터치 이벤트가 발생한 윈도우 객체를 나타냅니다

             <

               UIWindow: 0x15dd0a120; frame = (0 0; 320 480);

               gestureRecognizers = <NSArray: 0x2810370c0>;

               layer = <UIWindowLayer: 0x2810372d0>

             >

 

responder:          해당 터치 이벤트를 수신하는 객체를 나타냅니다.

             <

               UIView: 0x15dd0d460;

               frame = (0 0; 320 480);

               autoresize = W+H;

               gestureRecognizers = <NSArray: 0x281030870>;

               backgroundColor = UIExtendedGrayColorSpace 1 1;

               layer = <CALayer: 0x281e66fe0>

           >

 

해당터치이벤트의위치와이전위치를창(window)의좌표계에서나타냅니다.

location in window: {195.28204345703125, 190.22221374511719}

previous location in window: {195.28204345703125, 190.22221374511719} 

 

해당 터치 이벤트의 위치와 이전 위치를 뷰(view)의 좌표계에서 나타냅니다.

location in view: {195.28204345703125, 190.22221374511719}

previous location in view: {195.28204345703125, 190.22221374511719}

 

터치 이벤트 정보

<UITouchesEvent: 0x2811e4000>            UITouchesEvent 클래스의 인스턴스입니다. 터치 이벤트를 나타내는 객체입니다.

timestamp: 15468.5                       이벤트가 발생한 시간을 나타내는 속성입니다. 이벤트가 발생한 시간을 초 단위로 나타냅니다.

touches: {(                 이벤트에 포함된 터치 객체들의 집합을 나타내는 속성입니다. 이 코드에서는 하나의 터치 객체만 포함되어 있습니다.

               <UITouch: 0x102204080>

                phase: Began tap

                count: 1

                force: 0.000

                window: <

                                UIWindow: 0x100f0a3c0;

                                frame = (0 0; 320 480);

                                gestureRecognizers = <NSArray: 0x282486640>;

                                layer = <UIWindowLayer: 0x2824862b0>

                             >

               responder:

                            <

                               UIView: 0x100f0bb80;

                               frame = (0 0; 320 480);

                               autoresize = W+H;

                               gestureRecognizers = <NSArray: 0x282480ba0>;

                               backgroundColor = UIExtendedGrayColorSpace 1 1;

                               layer = <CALayer: 0x282aca9e0>

                            >

              location in window: {254.35896301269531, 135.79486083984375}

              previous location in window: {254.35896301269531, 135.79486083984375}

             location in view: {254.35896301269531, 135.79486083984375}

              previous location in view: {254.35896301269531, 135.79486083984375}

)}

 

 

UIKit 예제코드

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        let gestureRecognizer = NFingerGestureRecognizer(target: self, tappedCallback: { touch, location in
            print(touch)
        })
        self.view.addGestureRecognizer(gestureRecognizer)
    }
}

class NFingerGestureRecognizer: UIGestureRecognizer {
    var tappedCallback: (UITouch, CGPoint?) -> Void
    var touchViews = [UITouch:CGPoint]()
    init(target: Any?, tappedCallback: @escaping (UITouch, CGPoint?) -> ()) {
        self.tappedCallback = tappedCallback
        super.init(target: target, action: nil)
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        for touch in touches {
            let location = touch.location(in: touch.view)
            touchViews[touch] = location
            tappedCallback(touch, location)
        }
    }
}

 

SwiftUI 예제코드

import SwiftUI

struct ContentView: View {
    var body: some View {
        TapView{  touch, optLocation in
            print(touch)
        }
    }
}
class NFingerGestureRecognizer: UIGestureRecognizer {

    var tappedCallback: (UITouch, CGPoint?) -> Void

    var touchViews = [UITouch:CGPoint]()

    init(target: Any?, tappedCallback: @escaping (UITouch, CGPoint?) -> ()) {
        self.tappedCallback = tappedCallback
        super.init(target: target, action: nil)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        for touch in touches {
            let location = touch.location(in: touch.view)
            touchViews[touch] = location
            tappedCallback(touch, location)
        }
    }
}

struct TapView: UIViewRepresentable {

    var tappedCallback: (UITouch, CGPoint?) -> Void

    func makeUIView(context: UIViewRepresentableContext<TapView>) -> TapView.UIViewType {
        let v = UIView(frame: .zero)
        let gesture = NFingerGestureRecognizer(target: context.coordinator, tappedCallback: tappedCallback)
        v.addGestureRecognizer(gesture)
        return v
    }
    
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<TapView>) {
    }

}

 

728x90
반응형
LIST

'iOS' 카테고리의 다른 글

UIKit 화면 전환 방법과 예제  (0) 2023.05.09
WWDC22 Challenge: Learn Switch Control through gaming  (0) 2023.05.07
일급 컬렉션  (0) 2023.05.05
One-Time-Pad  (0) 2023.05.04
Swift XML 파싱  (0) 2023.05.03