## ๐Ÿ‘จโ€๐Ÿ”ฌ ์‹คํ—˜ 1 ```swift override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { if !isUserInteractionEnabled || isHidden || alpha <= 0.01 { return nil } if self.point(inside: point, with: event) { for subview in subviews.reversed() { let convertedPoint = subview.convert(point, from: self) if let hitTestView = subview.hitTest(convertedPoint, with: event) { return hitTestView } } return self } return nil } ``` - ์šฐ๋ฆฌ๊ฐ€ orangeView ์œ„์˜ ํ•œ ์ง€์ ์„ ํ„ฐ์น˜ํ–ˆ์„ ๋•Œ, UIKit ์€ ์–ด๋–ค ๋ทฐ์˜ hitTest ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœํ• ๊นŒ์š”? - hitTest ๊ฐ€ ํ˜ธ์ถœ ๋˜์—ˆ์„ ๋•Œ, ์ฝ”๋“œ์˜ ๋‚ด๋ถ€ ํ๋ฆ„์ด ์–ด๋– ํ• ์ง€ ๋– ์˜ฌ๋ ค๋ด…์‹œ๋‹ค. - hitTest๋ฅผ overrideํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ View๋ฅผ CustomView ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. - hitTest๋ฅผ override ํ•˜๊ณ , ์œ„์˜ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•ด๋ด…์‹œ๋‹ค. - ํ„ฐ์น˜ํ•œ ์œ„์น˜์˜ ๊ฐ€์žฅ ์ƒ์œ„ ๋ทฐ๋ฅผ ์ฝ˜์†”์ฐฝ์— print ํ•  ์ˆ˜ ์žˆ๋„๋ก, hitTest๋ฅผ ์ฝ”๋“œ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•ด๋ด…์‹œ๋‹ค. ```swift override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { if !isUserInteractionEnabled || isHidden || alpha <= 0.01 { return nil } if self.point(inside: point, with: event) { for subview in subviews.reversed() { let convertedPoint = subview.convert(point, from: self) if let hitTestView = subview.hitTest(convertedPoint, with: event) { print("background : \(String(describing: hitTestView.backgroundColor?.accessibilityName))") return hitTestView } } if !subviews.isEmpty { print("background2 : \(String(describing: self.backgroundColor?.accessibilityName))") } return self } return nil } ``` - ๋‹ค์Œ ์œ„์น˜๋ฅผ ํ„ฐ์น˜ํ•˜๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ ๊ณผ์ •์„ ์ถ”๋ก ํ•ด๋ด…์‹œ๋‹ค. - orangeView ์œ„๋ฅผ ํ„ฐ์น˜ ์˜ค๋ Œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. - greenView ์œ„๋ฅผ ํ„ฐ์น˜ ๊ทธ๋ฆฐ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. - purpleView ์œ„๋ฅผ ํ„ฐ์น˜ (์ฃผ๋ชฉ!) - ๊ฒน์ณ ์žˆ๋Š” ๋ถ€๋ถ„์„ ํ„ฐ์น˜ํ•œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค - ๊ฒน์ณ์žˆ์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ํ„ฐ์น˜ํ•œ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์™œ ๊ทธ๋Ÿฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์–ด๋‚ฌ์„๊นŒ์š”? `hitTest(_:with:)` ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์ขŒํ‘œ๊ฐ€ ๋ทฐ์˜ ์˜์—ญ์— ์†ํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌ(ex. `point(inside:with:)`์ด์šฉ)ํ•˜๊ณ , ํ•ด๋‹น ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, `hitTest(_:with:)` ๋ฉ”์„œ๋“œ๋Š” ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์ตœ์ƒ์œ„ ๋ทฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํ•˜์œ„ ๋ทฐ๋“ค์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์ด ๋ทฐ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์œ„์น˜๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์œ„์น˜์— ๋Œ€ํ•œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ทฐ๋ฅผ ์ฐพ๋Š”๋ฐ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. - blueView ์œ„๋ฅผ ํ„ฐ์น˜ - BlueView์—๋Š” UIButton์„ ์˜ฌ๋ฆฐ ํ›„, ๋ฐ˜์ฏค ๊ฑธ์น˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. - ์ด๋•Œ BlueView์™€ ๊ฒน์น˜์ง€ ์•Š์€ Button์˜ ์˜์—ญ์„ ํ„ฐ์น˜ํ–ˆ์„ ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”? - ํ„ฐ์น˜๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์™œ ๊ทธ๋Ÿฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์–ด๋‚ฌ์„๊นŒ์š”? - ์œ„์™€ ๋™์ผํ•œ ์ด์œ  ### ๋ฉ”์„œ๋“œ [**point(inside:with:)**](https://developer.apple.com/documentation/uikit/uiview/1622533-point) ์ˆ˜์‹ ์ž์— ์ง€์ •๋œ ์ง€์ ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” bool ๊ฐ’์„ ๋ฐ˜ํ™˜ return value: ํฌ์ธํŠธ๊ฐ€ ์ˆ˜์‹ ์ž์˜ bound ์•ˆ์— ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false