728x90
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)
}
}
다음과 같이 빨간 버튼 밑에 파란 버튼이 있다면, 빨간버튼 위를 터치한다면 빨간 버튼이 터치 이벤트를 수신 후 처리할 것이다.
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
'iOS > 설명' 카테고리의 다른 글
[iOS] point(inside:with:) (0) | 2022.04.09 |
---|---|
[iOS] addSubView를 할 때 weak, strong 레퍼런스 (0) | 2022.02.19 |
[iOS] Stretchable Image를 이용해 이미지 늘리기 (feat. 9-patch) (0) | 2022.02.08 |
[iOS] CoreData - (2) (0) | 2022.02.05 |
[iOS] CoreData - (1) (0) | 2022.02.01 |
댓글