UIPresentationController 传递触摸事件

Posted

技术标签:

【中文标题】UIPresentationController 传递触摸事件【英文标题】:UIPresentationController passing touch event 【发布时间】:2017-10-12 14:16:06 【问题描述】:

我正在尝试做一个从底部向上滑动到某个高度的自定义通知视图。我正在使用UIPresentationController,但问题是当第二个 VC 出现时,ViewController 上出现 VC 的触摸事件未被检测到,有没有办法做到这一点?

Here is a visual example of whats happening

【问题讨论】:

你写过代码吗?如果是的话,用您现有的解决方案/代码更新您的问题会很酷 【参考方案1】:

好吧,经过一番挣扎我得到了答案,发生的事情是即使你的frameOfPresentedViewInContainerView是屏幕的一小部分,containerView的那个frame的大小是整个窗口,所以我只是改变了containerView的frame与frameOfPresentedViewInContainerView 相同,现在您可以与两个控制器进行交互,希望对某人有所帮助。这是一个例子:

    class AlertPresentationController: UIPresentationController 

    override var frameOfPresentedViewInContainerView: CGRect 
        guard let container = containerView else 
            fatalError("Error presenting Alert Controller")
        
        let frameHeight: CGFloat = presentingViewController.view.frame.height * 0.2
        return CGRect(x: 0, y: 0, width: container.frame.width, height: frameHeight)
    

    override func presentationTransitionWillBegin() 
        containerView?.frame = frameOfPresentedViewInContainerView
    

【讨论】:

这个解决方案是救命稻草 我可以通过阅读这个答案来理解传递触摸事件的概念。谢谢!【参考方案2】:

如果您想访问presentingViewController 对象,您必须先关闭当前控制器。您可以通过将 UITapGestureRecognizer 添加到您的 notificationController 并使用该事件关闭通知来做到这一点。

另一种可能的方法是将通知实现为UIView 而不是UIViewController,并将其直接显示在 viewController 的视图上,而不是在顶部添加另一个控制器。

【讨论】:

我知道你的意思,我曾经将这些类型的警报创建为 UIView,但问题是我想通过应用程序中的所有 ViewController 使用该警报 创建一个类似AlertFactory 的类,它实例化您的通知并为任何 ViewController 提供创建和显示它们的可能性。如果你所有的 ViewController 都以相同的方式显示通知,你可以创建一个 UIViewController 扩展来实现它,它可以从任何 VC 访问

以上是关于UIPresentationController 传递触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

UIPresentationController 在巨大延迟后呈现

UIPresentationController 传递触摸事件

拖动以关闭 UIPresentationController

iOS 上的自定义 UIPresentationController

在两个不同的 UIPresentationController 之间进行适配

基于视图大小的自适应 UIPresentationController