UIPresentationController传递触摸事件

4
我正在尝试创建一个自定义通知视图,从底部向上滑动到一定高度。我使用了一个UIPresentationController,但问题是当第二个VC被呈现时,呈现VC的触摸事件无法被检测到。有没有办法能够解决这个问题?

这里是一个可视化示例


你已经写过代码了吗?如果是的话,更新你的问题并附上你现有的解决方案/代码会很酷。 - AlexWoe89
2个回答

23

经过一些努力,我找到了答案。实际上,即使您的frameOfPresentedViewInContainerView只占屏幕的一小部分,该框架所在的容器视图(containerView)的大小却是整个窗口。因此,我只需将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
    }
}

4
这个解决方案是救命稻草。 - Ahmed Elashker
1
通过阅读这个答案,我能够理解通过触摸事件传递的概念。谢谢! - DragonCherry

-2

如果您想要访问presentingViewController对象,您必须先关闭当前控制器。您可以通过向notificationController添加一个UITapGestureRecognizer并使用该事件关闭通知来实现。

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


我知道你的意思,我曾经创建过那种类型的警报作为UIView,但问题是我想在应用程序中的所有ViewController中使用该警报。 - Leonardo Emilio Dominguez
创建一个像 AlertFactory 一样的类,它实例化您的通知并使任何 ViewController 可以创建和显示它们。如果所有的 ViewControllers 都以相同的方式呈现通知,则可以创建一个 UIViewController 扩展来实现它,并且它将可从任何 VC 访问。 - jvrmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接