【发布时间】:2015-04-07 20:59:33
【问题描述】:
我正在尝试实现以下行为:
- 长按集合视图会将全窗口视图(称为 LetterView)置于最前面
- 后续手势/触摸仅由 LetterView 处理。
(编辑:我应该提一下,我想要看到 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)
- 这似乎不是第一响应者问题,因为我尝试在 LetterView 中覆盖 canBecomeFirstResponder 并在我将其移到前面时为其分配第一响应者状态
- 我尝试在 CollectionView 上设置 userInteractionEnabled=FALSE,但在将 LetterView 移到前面后,在 LetterView 上保持它为真。这禁用了两个视图的所有触摸事件
- 当我将 LetterView 移到前面时,我尝试为 LetterView 设置 ExclusiveTouch=True。这似乎没有任何作用。
除了任何特定提示之外,是否有任何通用技术可以像这样调试命中测试?根据有关 iOS 中命中测试的文档,iOS 应该更喜欢“最深”的子视图,它为 hitTest:withEvent: 返回是,因为 LetterView 是 collectionview 的子视图,并且在所有单元格的前面,应该是前面?是否可以启用任何日志记录以查看对视图层次结构的命中测试?
谢谢!
内特。
【问题讨论】:
-
如果 letterView 是全屏的,您可能不想像现在这样将它添加为集合视图的子视图。也许尝试将其添加到应用程序的窗口中,看看效果如何。至少在那种情况下它应该拦截所有的触摸事件。
-
我将它添加到 UICollectionViewWrapperView,而不是,它似乎非常接近。现在我可以在 CollectionView 上禁用用户交互,并在 letterView 上启用它。请随意将此作为答案,我会接受。
-
好的,我会发布的。谢谢!一个小小的旁注 - 小心剖析苹果的观点。很有可能,尤其是当您支持多个 iOS 版本时,层次结构可能会以您意想不到的方式改变和破坏内容。我从弄乱 UIImagePicker 的子视图中吸取了教训。
标签: ios uicollectionview