Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 按位置(CGPoint)标识UIView中的子视图_Ios_Swift_Uiview_Uigesturerecognizer_Uitapgesturerecognizer - Fatal编程技术网

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
方法可能更容易到达直接子视图。