首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从未输入过touchesBegan函数

从未输入过touchesBegan函数
EN

Stack Overflow用户
提问于 2015-12-30 18:46:04
回答 3查看 10.9K关注 0票数 0

我正在尝试弹出我的应用程序的弹出窗口。到目前为止,弹出窗口是在一个固定的坐标上弹出的,我正在尝试让它在用户点击的地方弹出。这就是我所拥有的:

代码语言:javascript
复制
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("touchesbegan")
    for touch in touches{
        //Handle touch
        let location = touch.locationInView(self.view)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let vc = storyboard.instantiateViewControllerWithIdentifier("ColonyPopoverController") as! ColonyPopoverController
        vc.modalPresentationStyle = .Popover
        vc.preferredContentSize = CGSizeMake(200, 150)

        if let popoverController = vc.popoverPresentationController {
            popoverController.delegate = self
            popoverController.sourceRect = CGRectMake(location.x, location.y, 20, 10)
            popoverController.sourceView = self.view
            self.presentViewController(vc, animated: true, completion: nil)
        }
    }
}

我注意到当我点击模拟器时,print语句永远不会打印出来。

我在视图中启用了interactionmulti-touch。我知道这很好用,因为我还将它与Google Maps集成在一起,这样当我点击时,google图钉就会出现:

代码语言:javascript
复制
func mapView(mapView: GMSMapView!, didTapAtCoordinate coordinate: CLLocationCoordinate2D) {
    print("You tapped at \(coordinate.latitude), \(coordinate.longitude)")
    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude)
    marker.title = "Sydney"
    marker.snippet = "Australia"
    marker.map = mapView

}

我还看到print语句也在打印。不知道我错过了什么。

superview和视图都启用了用户交互:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-31 12:10:34

事实证明,Googlemaps的GMSView消耗了视图中的其他手势,这必须明确禁止:

代码语言:javascript
复制
mapView.settings.consumesGesturesInView = false;
票数 1
EN

Stack Overflow用户

发布于 2015-12-31 01:42:09

有三个主要原因导致视图在您期望的时候不能被访问:

  • 它将userInteractionEnabled设置为false。显然你已经证实了事实并非如此。
  • 其他一些视图“在”感兴趣的视图之上,并且正在接受触动。请注意,子视图位于其父视图的顶部(在子视图覆盖的区域中),情节提要文档大纲中位置较低的视图位于大纲中位置较高的任何同级视图的顶部。(在屏幕截图中,KittyMapper®位于地图视图的顶部,位于它们重叠的任何区域。)如果你不想让顶视图接收到触动,你需要将userInteractionEnabled设置为false。
  • 感兴趣的视图在其父视图的边界之外。

命中测试以递归方式工作:窗口对每个子级调用hitTest(_:withEvent:) (从上到下),直到返回非零;如果pointInside(_:withEvent:)返回false,则hitTest(_:withEvent:)立即返回nil;否则,hitTest(_:withEvent:)对子级调用hitTest(_:withEvent:) (从上到下),直到返回非零,如果没有子级报告命中,则返回self

因此,如果子对象在其父对象的边界之外,它可以是可见的(如果所有祖先都将clipsToBounds设置为false),但永远不会接收到接触,因为其父对象的pointInside(_:withEvent:)将拒绝出现在子视图上的接触。

您可以通过使用Xcode's “Debug View Hierarchy” feature检查视图层次结构来诊断最后两种情况。

票数 7
EN

Stack Overflow用户

发布于 2015-12-30 20:10:53

如果userInteractionEnabled为true,则应调用touchesBegan,您的代码将正常工作,并在用户点击的位置显示弹出窗口。

如果你的视图是一个子视图,那么确保userInteractionEnabled在所有的超视图上都是真的。有关touchesBegan未被调用的更多信息,请查看this answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34527946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档