이 글의 목적

  • 일반적으로 ViewGesture를 추가하는 경우 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 안에 포함되는지를 파악해 리턴
    }
    
}
  • 결과는 다음과 같다.