lypw2009
lypw2009

Reputation: 221

When voiceOver is on, how to dismiss UIPresentController when tap on dimmed view

When voiceOver is on, how can I dismiss UIPresentViewController?

Upvotes: 0

Views: 347

Answers (1)

k-thorat
k-thorat

Reputation: 5123

You will need to add custom view to presenting view and add tap gesture recogniser to it.

Look into Adding Custom Views to a Presentation at Apple Doc

Also, added snippet of some of the functionality.

private lazy var backgroundView: UIView = UIView(frame: CGRect.zero)
private lazy var tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer()

override init(presentedViewController: UIViewController,
              presenting presentingViewController: UIViewController?) {

    super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismiss))
    self.backgroundView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.backgroundView.isUserInteractionEnabled = true
    self.backgroundView.addGestureRecognizer(tapGestureRecognizer)
}

override func containerViewDidLayoutSubviews() {
    super.containerViewDidLayoutSubviews()
    self.presentedView?.frame = self.frameOfPresentedViewInContainerView
    if let container = self.containerView {
        // Set frame for background view
        self.backgroundView.frame = container.bounds
    }
}

override func presentationTransitionDidEnd(_ completed: Bool) {
    if !completed {
        self.backgroundView.removeFromSuperview()
    }
    // Additional TearDown
}

override func presentationTransitionWillBegin() {
    self.containerView?.addSubview(self.backgroundView)
    // Additional SetUp
}

// Tap gesture handler
@objc
func dismiss() {
    self.presentedViewController.dismiss(animated: true, completion: nil)
}

Upvotes: 1

Related Questions