full-window 视图在集合视图前面

Full-window view in front of a collection view

我正在尝试实现以下行为:

(编辑:我应该提到我想要看到 LetterView 下的 collectionview 项目的透明效果)

我似乎 运行 喜欢其他人试图实现的行为,不过 - 我的触摸由 LetterView 和集合视图处理。 IE。我可以滚动集合视图并让我的最顶层视图处理点击。 XCode中显示视图层级,很明显LetterView在最前面,而且UICollectionView和LetterView都是UICollectionWrapperView的子视图。

LetterView 是带有 UIViewController 子类的 UIView 子类。它以编程方式添加到视图层次结构中,在我的 UICollectionViewController 子类的 viewDidLoad 方法中,如下所示:

super.viewDidLoad()
letterDrawingViewController = LetterDrawingViewController()
let viewFrame : CGRect = self.collectionView!.frame
letterDrawingViewController.view = LetterDrawingView.init(frame:viewFrame)
letterDrawingView = letterDrawingViewController.view
self.addChildViewController(letterDrawingViewController)
letterDrawingViewController.didMoveToParentViewController(self)
collectionView?.addSubview(letterDrawingView)

除了任何具体的提示之外,是否有任何通用的调试此类命中测试的技巧?根据 iOS 中关于命中测试的文档,iOS 应该更喜欢 "deepest" 子视图,returns 是 hitTest:withEvent:,因为 LetterView 是一个子视图collectionview 的,在它所有单元格的前面,应该是前面?是否可以启用任何日志记录以查看正在运行的视图层次结构的命中测试?

谢谢!

内特。

虽然我认为您可以稍微轻松地处理您的问题,但我认为您犯了设计错误。感觉就像您正在尝试通过向您的视图添加子视图并尝试像在现代 JavaScript 单页应用程序中那样拦截那里的触摸来像 Web 开发人员一样编写这种想法。在 iOS 中,我认为这是糟糕的设计。您应该使用 apple 提供的方法继续或呈现新的 viewController。

所以你的代码看起来应该像这样:

letterDrawingViewController = LetterDrawingViewController()
self.presentViewController(letterDrawingViewController, animated: true, completion: nil)

iOS8 的额外好处是允许您拥有很棒的自定义过渡。看看这个:http://www.appcoda.com/custom-segue-animations/

如果 letterView 是全屏的,您可能不想像现在这样将它添加为集合视图的子视图。也许尝试将它添加到应用程序的 window 中,看看效果如何。至少在那种情况下它应该拦截所有触摸事件。

另一种方法是在您呈现和关闭 letterView 时启用和禁用 collectionView 上的用户交互,尽管公认这是一种更脆弱的感觉。 所以,当letterView即将呈现时,可以调用

    self.collectionView.userInteractionEnabled = NO;

如果您也知道该视图何时将被取消,您可以致电

    self.collectionView.userInteractionEnabled = YES;

这里唯一需要担心的是,您不会进入 letterView 未呈现且 collectionView 也忽略用户触摸的不良状态。那会感觉完全崩溃了。