Ios 按位置(CGPoint)标识UIView中的子视图
我正在尝试找出在Ios 按位置(CGPoint)标识UIView中的子视图,ios,swift,uiview,uigesturerecognizer,uitapgesturerecognizer,Ios,Swift,Uiview,Uigesturerecognizer,Uitapgesturerecognizer,我正在尝试找出在ui视图中给定CGPoint处找到确切子视图(如果有)的最佳方法 “我的场景/视图控制器”的一部分是一个自定义的UIView子类(在XIB中设计),它提供了一个UIStackView子视图(也是自定义的,XIB设计的) VC在该自定义视图上有一个UITapgestureRecognitizer,在我的@iAction中,我想确定它的哪个特定子视图被点击,然后相应地处理它: @IBAction func handleTap(recognizer:UITapGestureRecogn
ui视图中给定CGPoint
处找到确切子视图(如果有)的最佳方法
“我的场景/视图控制器”的一部分是一个自定义的UIView
子类(在XIB中设计),它提供了一个UIStackView
子视图(也是自定义的,XIB设计的)
VC在该自定义视图上有一个UITapgestureRecognitizer
,在我的@iAction
中,我想确定它的哪个特定子视图被点击,然后相应地处理它:
@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
let tapLocation = recognizer.location(in: recognizer.view)
if let subviewTapped = customView.subviewAtLocation(tapLocation) {
handleTapForSubview(subviewTapped)
}
}
但是,我不知道如何实现子视图定位(CGPoint)
方法。我在标准UIView方法中找不到任何东西
欢迎就如何做提出任何建议
或者,我考虑在每个子视图中添加一个tap识别器,然后将其委托给父视图,然后委托给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)
这真的很有效,谢谢!为了更精确,我在筛选中添加了第二个检查,它只包括该自定义类的子视图:让filteredSubViews=stackView.subViews.filter{subView->Bool in return subView.frame.contains(location)&&subView as?CustomViewClass!=nil}
谢谢您的建议。这种方法在某些情况下似乎是有意义的,但从我在Apple文档中收集到的关于hitTest
()的信息来看,它实际上是最远的视图,而不是即时UIStackView
中的视图。因此,出于这种需要,@ajeferson的stackView.subviews.filter
方法可能更容易到达直接子视图。