在集合视图前面的全窗口视图

时间:2015-04-07 20:59:33

标签: ios uicollectionview

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

  • 长按集合视图会将全窗口视图(称之为LetterView)带到前面
  • 后续手势/触摸仅由LetterView处理。

(编辑:我应该提一下,我希望看到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)
  • 它似乎不是第一响应者问题,因为我尝试在LetterView中覆盖canBecomeFirstResponder并在我将其移至前面时将其分配给第一响应者状态
  • 我尝试在CollectionView上设置userInteractionEnabled = FALSE,但在将LetterView移到前面后将其保持在LetterView上。这会禁用两个视图的所有触摸事件
  • 当我将LetterView移到前面时,我尝试为LetterView设置exclusiveTouch = True。这似乎没有做任何事情。

除了任何具体的提示,是否有任何一般的技术来调试这样的命中测试?根据iOS中命中测试的文档,iOS应该更喜欢为hitTest:withEvent:返回yes的“最深”子视图,因为LetterView是collectionview的子视图,并且在它的所有单元格前面,应该是面前?我是否可以启用任何日志记录来查看对视图层次结构的命中测试?

谢谢!

内特。

2 个答案:

答案 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也忽略了用户的触摸。那会觉得完全破碎了。