본문 바로가기
iOS/설명

[iOS] hitTest

by Sky Titan 2022. 2. 16.
728x90
 

Apple Developer Documentation

 

developer.apple.com

hitTest

func hitTest(_ point: CGPoint, 
        with event: UIEvent?) -> UIView?
  • 이 메서드는 subview들의 point 메서드를 호출해서 어떤 하위 뷰에서 터치 이벤트를 처리할지를 결정하는 메서드이다.
  • point 지점을 포함하는 뷰 계층에서 가장 멀리 있는 하위 뷰를 반환한다.
    • 즉, 해당 뷰 계층의 subview들 중 가장 앞에 있는 뷰를 반환한다.
  • 만약 해당 뷰 계층 바깥에서 point가 위치한다면 nil을 반환한다.
    • 즉, 해당 뷰보다 더 밑에 있는 뷰로 터치 이벤트를 넘기게 된다.

 

실제 사용 예시

 터치를 입력했을 때, 가장 앞에 있는 뷰가 아닌 그 밑에 있는 뷰가 터치이벤트를 처리했으면 하는 상황에서 해당 메서드를 override해서 사용하는 경우가 많다.

 

1. view에서 super.hitTest() 를 반환하는 경우


import UIKit
import TasBase
import TasExample

class ViewController: TSViewController {

  
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
    }
    @IBAction func blueButtonClicked(_ sender: Any) {
        print("blue")
    }
    @IBAction func redButtonClicked(_ sender: Any) {
        print("red")
    }
    
}

 


import UIKit

@IBDesignable
class RedButton: UIButton {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }
    
    func setupView() {
        backgroundColor = UIColor.red
    }
    
    // RedButton에서 터치 이벤트 처리
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        return super.hitTest(point, with: event)
    }
}

 다음과 같이 빨간 버튼 밑에 파란 버튼이 있다면, 빨간버튼 위를 터치한다면 빨간 버튼이 터치 이벤트를 수신 후 처리할 것이다.

RedButton이 터치이벤트 수신 후 처리

 

2. nil을 반환하는 경우



import UIKit

@IBDesignable
class RedButton: UIButton {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }
    
    func setupView() {
        backgroundColor = UIColor.red
    }
    
    // RedButton에서 받는 touch event는 더 밑에 있는 뷰로 넘긴다.
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        return nil
    }
}

 이번엔 hitTest에서 nil을 반환하게 되고 이런 경우엔 그 밑에 있는 파란 버튼이 터치이벤트를 수신하고 처리하게 된다.

파란 버튼이 터치 이벤트 수신 후 처리

 

728x90

댓글