I created a customized UIPresentationController and wish the highest sixth of the display screen to comprise a dismissButton and dimmingView to fade out and in on current and dismiss, respectively. Nonetheless, as a result of the dismissButton is exterior the presentedView, it isn’t tappable. Is there any answer to this?
Word: I do know I can add the subview to the presentedView after which transfer the dismissButton exterior of the view, but when I do that, the button presents in the identical method that the remainder of the controller does, as an alternative of fading in like I need it to (not sliding up).
@obtainable(iOS 13.0, *)
open class CUICFiveSixthPopUpTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
let dimmingColor: UIColor!
public init(dimmingColor: UIColor) {
self.dimmingColor = dimmingColor
tremendous.init()
}
public func presentationController(forPresented offered: UIViewController, presenting: UIViewController?, supply: UIViewController) -> UIPresentationController? {
return CUICFiveSixthPopUpPresentationController(presentedViewController: offered, presenting: presenting, dimmingColor: dimmingColor)
}
}
@obtainable(iOS 13.0, *)
open class CUICFiveSixthPopUpPresentationController: UIPresentationController {
open override var frameOfPresentedViewInContainerView: CGRect {
let bounds = presentingViewController.view.bounds
let dimension = CGSize(width: UIScreen.primary.bounds.width, peak: UIScreen.primary.bounds.peak*5/6)
let origin = CGPoint(x: bounds.midX - dimension.width / 2, y: UIScreen.primary.bounds.peak - dimension.peak)
return CGRect(origin: origin, dimension: dimension)
}
public init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, dimmingColor: UIColor) {
tremendous.init(presentedViewController: presentedViewController, presenting: presentingViewController)
presentedView?.autoresizingMask = [
.flexibleTopMargin,
.flexibleBottomMargin,
.flexibleLeftMargin,
.flexibleRightMargin
]
presentedViewController.view.layer.cornerRadius = viewRadius
presentedViewController.view.clipsToBounds = true
dimmingView.backgroundColor = dimmingColor
dismissButton.backgroundColor = dimmingColor.lighter()
presentedView?.translatesAutoresizingMaskIntoConstraints = true
}
let iconSize: CGFloat = 40
let viewRadius: CGFloat = 35
let dimmingView: UIView = {
let dimmingView = UIView(body: .zero)
dimmingView.translatesAutoresizingMaskIntoConstraints = false
return dimmingView
}()
let dismissButton: UIButton = {
let dismissButton = UIButton(body: .zero)
dismissButton.tintColor = .white
dismissButton.alpha = 0.8
dismissButton.setImage(.shut, for: .regular)
dismissButton.translatesAutoresizingMaskIntoConstraints = false
return dismissButton
}()
@objc non-public func dimmingViewTapped(_ sender: UITapGestureRecognizer) {
let level = sender.location(in: presentingViewController.view!)
if dismissButton.body.comprises(level) {
presentedViewController.dismiss(animated: true)
}
}
open override func presentationTransitionWillBegin() {
tremendous.presentationTransitionWillBegin()
let superview = presentingViewController.view!
let presentedView = presentedView!
superview.addSubview(dimmingView)
superview.addSubview(dismissButton)
NSLayoutConstraint.activate([
dimmingView.leadingAnchor.constraint(equalTo: superview.leadingAnchor),
dimmingView.trailingAnchor.constraint(equalTo: superview.trailingAnchor),
dimmingView.bottomAnchor.constraint(equalTo: superview.bottomAnchor),
dimmingView.topAnchor.constraint(equalTo: superview.topAnchor),
dismissButton.topAnchor.constraint(equalTo: superview.topAnchor, constant: .marginFromTopOfScreen),
dismissButton.leftAnchor.constraint(equalTo: superview.leftAnchor, constant: .marginLeft),
dismissButton.heightAnchor.constraint(equalToConstant: iconSize),
dismissButton.widthAnchor.constraint(equalToConstant: iconSize),
])
dismissButton.layer.cornerRadius = iconSize/2
let tapGesture = UITapGestureRecognizer(goal: self, motion: #selector(dimmingViewTapped(_:)))
dimmingView.addGestureRecognizer(tapGesture)
dimmingView.alpha = 0
presentingViewController.transitionCoordinator?.animate(alongsideTransition: { [weak self] _ in
self?.dimmingView.alpha = 1
}, completion: nil)
}
open override func dismissalTransitionWillBegin() {
tremendous.dismissalTransitionWillBegin()
presentingViewController.transitionCoordinator?.animate(alongsideTransition: { _ in
self.dimmingView.alpha = 0
}, completion: { _ in
self.dimmingView.removeFromSuperview()
})
}
}