按位置识别 UIView 中的子视图(CGPoint)
Identify Subview in UIView by Location (CGPoint)
我正在尝试找出在 UIView
.
中的给定 CGPoint
处找到确切子视图(如果有的话)的最佳方法
我的 scene/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)
我正在尝试找出在 UIView
.
CGPoint
处找到确切子视图(如果有的话)的最佳方法
我的 scene/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)