【问题标题】:Full-window view in front of a collection view集合视图前的全窗口视图
【发布时间】: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


【解决方案1】:

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

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

    self.collectionView.userInteractionEnabled = NO;

如果您还知道该视图何时将被关闭,您可以致电

    self.collectionView.userInteractionEnabled = YES;

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,但我想要 LetterView 下面的 collectionview 的透明效果。使用 presentviewcontroller,或将新视图推送到导航控制器堆栈并不能完全满足我想要的行为。
    • 您只需将呈现的视图控制器背景设置为透明即可。您可以通过添加子视图来呈现视图控制器来实现任何效果。触摸事件问题只是您在添加功能时会发现的一系列错误和问题中的第一个。 iOS 版本之间的视图层次结构不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2011-09-05
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多