[英]Identify Subview in UIView by Location (CGPoint)
我正在嘗試找出在UIView
中的給定CGPoint
處找到確切子視圖(如果有)的最佳方法。
我的場景/ViewController 的一部分是自定義UIView
子類(在 XIB 中設計),它呈現子視圖的UIStackView
(也是自定義的,XIB 設計的)。
VC 在該自定義視圖上有一個UITapGestureRecognizer
,在我的@IBAction
,我想確定它的哪個特定子視圖被點擊,然后相應地處理它:
@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
let tapLocation = recognizer.location(in: recognizer.view)
if let subviewTapped = customView.subviewAtLocation(tapLocation) {
handleTapForSubview(subviewTapped)
}
}
但是,我不知道如何實現subviewAtLocation(CGPoint)
方法。 我無法在標准 UIView 方法中找到任何內容。
歡迎任何有關如何完成的建議。
或者,我考慮為每個子視圖添加一個點擊識別器,然后委托給父視圖,然后委托給 VC,但這感覺效率低下,就像它在視圖中放置了太多控制邏輯,而不是 VC。
謝謝你。
一個解決方案是使用CGRect
的contains(point:)
方法。 這個想法是迭代堆棧視圖的子視圖並檢查哪些子視圖包含觸摸點。 這里:
@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
let tapLocation = recognizer.location(in: recognizer.view)
let filteredSubviews = stackView.subviews.filter { subView -> Bool in
return subView.frame.contains(tapLocation)
}
guard let subviewTapped = filteredSubviews.first else {
// No subview touched
return
}
// process subviewTapped however you want
}
//使用hitTest()方法。 這給出了包含點的視圖
let subView = parentView.hitTest(point, with: nil)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.