我正在尝试实现以下行为:
(编辑:我应该提一下,我希望看到LetterView下面的collectionview项目的透明效果)
我似乎遇到了其他人都试图实现的行为 - 但是我的触摸得到了LetterView和集合视图的处理。即我可以滚动集合视图并按最顶层视图处理。在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应该更喜欢为hitTest:withEvent:
返回yes的“最深”子视图,因为LetterView是collectionview的子视图,并且在它的所有单元格前面,应该是面前?我是否可以启用任何日志记录来查看对视图层次结构的命中测试?
谢谢!
内特。
答案 0 :(得分:0)
虽然我认为您可以轻松地处理您的问题,但我认为您犯了设计错误。通过在视图中添加子视图并尝试拦截那里的触摸,就像在现代JavaScript单页应用程序中那样,您感觉就像尝试将这种思维编码为Web开发者一样。在iOS中我认为这是糟糕的设计。您应该使用apple提供的方法来segue或呈现新的viewController。
所以你的代码看起来应该像:
letterDrawingViewController = LetterDrawingViewController()
self.presentViewController(letterDrawingViewController, animated: true, completion: nil)
iOS8的另一个好处是可以让你拥有很棒的自定义转换。看看这个:http://www.appcoda.com/custom-segue-animations/
答案 1 :(得分:0)
如果letterView是全屏的,您可能不想像现在这样将其添加为集合视图的子视图。也许尝试将其添加到应用程序的窗口,看看它是如何做的。至少在那种情况下,它应该拦截所有的触摸事件。
另一种方法,虽然可以说是一种更脆弱的感觉,但是当你出现并解散letterView时,会启用和禁用collectionView上的用户交互。 因此,当即将呈现letterView时,您可以调用
self.collectionView.userInteractionEnabled = NO;
如果您也知道该视图即将被解雇,您可以致电
self.collectionView.userInteractionEnabled = YES;
这里唯一需要担心的是,你没有进入一个糟糕的状态,你的letterView没有呈现,而你的collectionView也忽略了用户的触摸。那会觉得完全破碎了。