如何向暗淡的视图背景添加点击手势?

问题描述 投票:0回答:3

我已经尝试了一段时间。下面的代码是我的UIPresentationController。当按下按钮时,我添加了一个暗淡的UIView,并且第二个模式(presentedViewController)在中途弹出。

我在presentationTransitionWillBegin()方法中添加了轻击手势识别器我不知道为什么当我单击暗淡的UIView时为什么没有注册轻击手势。

我尝试过更改“目标”并将手势添加到其他位置。还查看了其他帖子,但对我没有任何帮助。

谢谢

import UIKit

class PanModalPresentationController: UIPresentationController {

    override var frameOfPresentedViewInContainerView: CGRect {
        var frame: CGRect = .zero
        frame.size = size(forChildContentContainer: presentedViewController, withParentContainerSize: containerView!.bounds.size)
        frame.origin.y = containerView!.frame.height * (1.0 / 2.0)
        print("frameOfPresentedViewInContainerView")
        return frame
    }

    private lazy var dimView: UIView! = {
        print("dimView")
        guard let container = containerView else { return nil }

        let dimmedView = UIView(frame: container.bounds)
        dimmedView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        dimmedView.isUserInteractionEnabled = true

        return dimmedView
    }()

    override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
        print("init presentation controller")
        super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    }

    override func presentationTransitionWillBegin() {

        guard let container = containerView else { return }
        print("presentation transition will begin")

        container.addSubview(dimView)
        dimView.translatesAutoresizingMaskIntoConstraints = false
        dimView.topAnchor.constraint(equalTo: container.topAnchor).isActive = true
        dimView.leadingAnchor.constraint(equalTo: container.leadingAnchor).isActive = true
        dimView.trailingAnchor.constraint(equalTo: container.trailingAnchor).isActive = true
        dimView.bottomAnchor.constraint(equalTo: container.bottomAnchor).isActive = true
        dimView.isUserInteractionEnabled = true

        let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        dimView.addGestureRecognizer(recognizer)

        container.addSubview(presentedViewController.view)
        presentedViewController.view.translatesAutoresizingMaskIntoConstraints = false
        presentedViewController.view.bottomAnchor.constraint(equalTo: container.bottomAnchor).isActive = true
        presentedViewController.view.widthAnchor.constraint(equalTo: container.widthAnchor).isActive = true
        presentedViewController.view.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true

        guard let coordinator = presentingViewController.transitionCoordinator else { return }
        coordinator.animate(alongsideTransition: { _ in
            self.dimView.alpha = 1.0
        })

        print(dimView.alpha)
    }

    override func dismissalTransitionWillBegin() {
        guard let coordinator = presentedViewController.transitionCoordinator else {
            print("dismissal coordinator")
            self.dimView.alpha = 0.0
            return
        }
        print("dismissal transition begin")
        coordinator.animate(alongsideTransition: { _ in
            self.dimView.alpha = 0.0
        })
    }

    override func containerViewDidLayoutSubviews() {
        print("containerViewDidLayoutSubviews")
        presentedView?.frame = frameOfPresentedViewInContainerView
//        presentedViewController.dismiss(animated: true, completion: nil)
    }

    override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize {
        print("size")
        return CGSize(width: parentSize.width, height: parentSize.height * (1.0 / 2.0))
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        print("tapped")
        //        presentingViewController.dismiss(animated: true, completion: nil)
        presentedViewController.dismiss(animated: true, completion: nil)
    }
}
ios swift uigesturerecognizer uipopoverpresentationcontroller
3个回答
0
投票

我无法分辨出presentedViewController.view的帧/边界是什么,但是即使上半部分的alpha为0,它也可能覆盖了您的dimView并接收了轻敲事件,而不是dimView-因为presentedViewController.view是作为子视图添加到dimView的顶部。


0
投票

您可能需要等到控制器出现后,再将手势添加到其超级视图的第一个子视图中。我之前使用过此功能,可以通过后台点击关闭自定义警报控制器。您可能会做类似的事情:

viewController.present(alertController, animated: true) {
     // Enabling Interaction for Transparent Full Screen Overlay
     alertController.view.superview?.subviews.first?.isUserInteractionEnabled = true
     let tapGesture = UITapGestureRecognizer(target: alertController, action: #selector(alertController.dismissSelf))
     alertController.view.superview?.subviews.first?.addGestureRecognizer(tapGesture)
}

0
投票

嗯,尝试改用它。让我知道事情的后续。它对我有用。

class PC: UIPresentationController {

    /*
     We'll have a dimming view behind.
     We want to be able to tap anywhere on the dimming view to do a dismissal.
     */

    override var frameOfPresentedViewInContainerView: CGRect {

        let f = super.frameOfPresentedViewInContainerView
        var new = f
        new.size.height /= 2
        new.origin.y = f.midY
        return new
    }

    override func presentationTransitionWillBegin() {

        let con = self.containerView!
        let v = UIView(frame: con.bounds)
        v.backgroundColor = UIColor.black
        v.alpha = 0
        con.insertSubview(v, at: 0)

        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        v.addGestureRecognizer(tap)

        let tc = self.presentedViewController.transitionCoordinator!
        tc.animate(alongsideTransition: { _ in
            v.alpha = 1
        }, completion: nil)
    }

    @objc func handleTap() {
        print("tapped")
        self.presentedViewController.dismiss(animated: true, completion: nil)
    }

    override func dismissalTransitionWillBegin() {

        let con = self.containerView!
        let v = con.subviews[0]

        let tc = self.presentedViewController.transitionCoordinator!
        tc.animate(alongsideTransition: { _ in
            v.alpha = 0
        }, completion: nil)

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.