이 글의 목적
일반적으로 View에 Gesture를 추가하는 경우 Interaction이 가능한 UIButton이나 UITextField 등을 제외하면 subview도 제스쳐에 반응하게 된다.
아래에 사진과 같은 상황에서 나는 흰색 View를 눌렀을때만 Gesture가 인식하길 원한다.

평소에 늘 하던 방식인 코드를 적성한다면 초록색 View를 눌렀을때도 똑같이 Gesture가 인식된다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.screenDidTap(_:)))
self.view.addGestureRecognizer(tapGesture)
}
@objc private func screenDidTap(_ gesture: UITapGestureRecognizer) {
print("Tap!")
}
}
앞서 말했듯 나는 흰색 View를 눌렀을 때만 인식되길 원한다.
이런 경우 이렇게 수정하면 된다.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var greenView: UIView! // 해당 View 지정
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.screenDidTap(_:)))
tapGesture.delegate = self
self.view.addGestureRecognizer(tapGesture)
}
@objc private func screenDidTap(_ gesture: UITapGestureRecognizer) {
print("Tap!")
}
}
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return !self.greenView.frame.contains(touch.location(in: self.view)) // 터치 영역이 해당 View의 Frame 안에 포함되는지를 파악해 리턴
}
}
결과는 다음과 같다.
