터치 이벤트가 발생할 경우 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
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>) {
}
}
'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 |