iOS/Swift
[Swift] Gesture Recogniger 짧게 요약
ywangnon
2021. 9. 17. 03:32
Gesture Recognizer
터치와 관련된 제스처 이벤트를 인식하고, 액션 메세지를 보내 제스처 관련 이벤트를 처리
구현방법
- 스토리보드
- 코드(타겟 액션)
- 델리게이트
Tap
한손가락 또는 여러 손가락 짧게 한번 누르기
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
outerView.addGestureRecognizer(tapGesture)
@objc func tapGesture(_ sender: UIGestureRecognizer) {
// 탭 액션
print("tap")
self.change = !self.change
self.view.backgroundColor = change ? .white : .black
}
Pinch
두 손가락 벌리기, 오므리기
scale은 변화값인 듯하다. 마지막에 1.0로 설정하지 않으면 누적되어 사용할수록 점점 빠르게 변한다.
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchGesture(_:)))
outerView.addGestureRecognizer(pinchGesture)
@objc func pinchGesture(_ sender: UIGestureRecognizer) {
if let pinch = sender as? UIPinchGestureRecognizer {
outerView.transform = outerView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
pinch.scale = 1.0
}
}
Rotation
회전
rotation은 회전값인 듯하다. 마지막에 0으로 설정하지 않으면 누적되어 사용할수록 점점 빠르게 회전한다.
let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(self.rotationGesture(_:)))
outerView.addGestureRecognizer(rotationGesture)
@objc func rotationGesture(_ sender: UIGestureRecognizer) {
if let rotation = sender as? UIRotationGestureRecognizer {
outerView.transform = outerView.transform.rotated(by: rotation.rotation)
rotation.rotation = 0
}
}
Swipe
선 긋기
direction으로 스와이프할 방향을 정해줘야한다.
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeGesture(_:)))
swipeGesture.direction = .down
view.addGestureRecognizer(swipeGesture)
@objc func swipeGesture(_ sender: UIGestureRecognizer) {
if let swipe = sender as? UISwipeGestureRecognizer {
print("swipe")
}
}
Pan
잡아 끌기
minimumNumberOfTouches으로 필요한 손가락수를 정할 수 있다.
변화값을 구해서 setTranslation으로 설정하지 않으면 pan한 방향으로 계속 나아간다.
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGesture(_:)))
panGesture.minimumNumberOfTouches = 3 // 손가락 3개 필요
outerView.addGestureRecognizer(panGesture)
@objc func panGesture(_ sender: UIGestureRecognizer) {
if let pan = sender as? UIPanGestureRecognizer {
let transition = pan.translation(in: outerView)
let changedX = outerView.center.x + transition.x
let changedY = outerView.center.y + transition.y
outerView.center = CGPoint(x: changedX, y: changedY)
pan.setTranslation(CGPoint.zero, in: outerView)
}
}
ScreenEdgePan
가장자리 잡아 끌기
edges로 적용할 가장자리를 정해준다.
let edgeGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(self.screenEdgeGesture(_:)))
edgeGesture.edges = .right // 오른쪽 가장자리
view.addGestureRecognizer(edgeGesture)
@objc func screenEdgeGesture(_ sender: UIGestureRecognizer) {
if let edge = sender as? UIScreenEdgePanGestureRecognizer {
print("edge.edges")
self.change = !self.change
outerView.backgroundColor = change ? .red : .blue
}
}
LongPress
길게 누르기
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGesture(_:)))
longPress.numberOfTouchesRequired = 2 // 터치 손가락 수
longPress.numberOfTapsRequired = 2 // 터치 수. 추가적인 터치수라서 +1 해준 수를 터치해야한다.
longPress.minimumPressDuration = 3 // 누르는 시간
// 두 손가락으로 3번 터치해서 마지막에 3초간 눌러야한다.
outerView.addGestureRecognizer(longPress)
@objc func longPressGesture(_ sender: UIGestureRecognizer) {
if let press = sender as? UILongPressGestureRecognizer {
print("press")
self.change = !self.change
innerView.backgroundColor = change ? .yellow : .purple
}
}
코드로 하는 방법을 알아봤다.
델리게이트는 델리게이트를 연결하고 지정된 함수에 기능을 추가해주면 된다.
샘플인데 파일있는 위치 직접 들어가게 되어 있다.
https://github.com/ywangnon/Programming_Example/tree/master/GestureSample