現在Presentの遷移によるポップアップの作成をしています。
その際の遷移アニメーションをcrossDissolveにしたいのですが、crossDissolveにすると以下の画像のようにポップアップ遷移元画面が真っ黒になってしまいます。
coverVerticalとflipHorizontalを使用した場合は背景が保たれています。
なにか知見をお持ちの方、ご回答いただけるとありがたいです。
【うまくいく方:coverVerticalとflipHorizontal】
Swift
1 2import UIKit 3 4class ViewController: UIViewController, UIViewControllerTransitioningDelegate { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view. 9 } 10 11 @IBAction func showModal(_ sender: Any) { 12 let modalVC = self.storyboard?.instantiateViewController(identifier: "modal") 13 14//////////////////////////////////////////////////////////////////////////////////// 15 modalVC!.modalTransitionStyle = .crossDissolve 16//////////////////////////////////////////////////////////////////////////////////// 17 18 modalVC!.modalPresentationStyle = .custom 19 modalVC!.transitioningDelegate = self 20 present(modalVC!, animated: true, completion: nil) 21 } 22 23 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { 24 return PresentationController(presentedViewController: presented, presenting: presenting) 25 } 26} 27 28//PresentationController.swift 29 30//import UIKit 31 32class PresentationController: UIPresentationController { 33 // 呼び出し元のView Controller の上に重ねるオーバレイView 34 var overlayView = UIView() 35 36 // 表示トランジション開始前に呼ばれる 37 override func presentationTransitionWillBegin() { 38 guard let containerView = containerView else { 39 return 40 } 41 overlayView.frame = containerView.bounds 42 overlayView.gestureRecognizers = [UITapGestureRecognizer(target: self, action: #selector(PresentationController.overlayViewDidTouch(_:)))] 43 overlayView.backgroundColor = .black 44 overlayView.alpha = 0.0 45 containerView.insertSubview(overlayView, at: 0) 46 47 /// ポップアップ元画面の透明度を濁らせる 48 presentedViewController.transitionCoordinator?.animate(alongsideTransition: {[weak self] context in 49 self?.overlayView.alpha = 0.5 50 }, completion:nil) 51 } 52 53 // 非表示トランジション開始前に呼ばれる 54 override func dismissalTransitionWillBegin() { 55 /// ポップアップ元画面の透明度をもとに戻す 56 presentedViewController.transitionCoordinator?.animate(alongsideTransition: {[weak self] context in 57 self?.overlayView.alpha = 0.0 58 }, completion:nil) 59 } 60 61 // 非表示トランジション開始後に呼ばれる 62 override func dismissalTransitionDidEnd(_ completed: Bool) { 63 if completed { 64 overlayView.removeFromSuperview() 65 } 66 } 67 68 // ポップアップのマージン 69 let margin = { () -> CGPoint in 70 // 端末の画面サイズ 71 let screenWidth = Double(UIScreen.main.bounds.size.width) 72 let screenHeight = Double(UIScreen.main.bounds.size.height) 73 74 let marginX = screenWidth * 0.13 75 let marginY = screenHeight * 0.44 76 77 return CGPoint(x: CGFloat(marginX), y: CGFloat(marginY)) 78 } 79 // 子のコンテナサイズを返す 80 override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize { 81 return CGSize(width: parentSize.width - margin().x, height: parentSize.height - margin().y) 82 } 83 84 // 呼び出し先のView Controllerのframeを返す 85 override var frameOfPresentedViewInContainerView: CGRect { 86 var presentedViewFrame = CGRect() 87 let containerBounds = containerView!.bounds 88 let childContentSize = size(forChildContentContainer: presentedViewController, withParentContainerSize: containerBounds.size) 89 presentedViewFrame.size = childContentSize 90 presentedViewFrame.origin.x = margin().x / 2.0 91 presentedViewFrame.origin.y = margin().y / 2.0 92 93 return presentedViewFrame 94 } 95 96 // レイアウト開始前に呼ばれる 97 override func containerViewWillLayoutSubviews() { 98 overlayView.frame = containerView!.bounds 99 presentedView?.frame = frameOfPresentedViewInContainerView 100 presentedView?.layer.cornerRadius = 10 101 presentedView?.clipsToBounds = true 102 } 103 104 // レイアウト開始後に呼ばれる 105 override func containerViewDidLayoutSubviews() { 106 } 107 108 // overlayViewをタップした時に呼ばれる 109 @objc func overlayViewDidTouch(_ sender: UITapGestureRecognizer) { 110 /// ポップアップ元画面へ戻る 111 presentedViewController.dismiss(animated: true, completion: nil) 112 } 113}
試したこと
・modalPresentationStyleをoverCurrentContextにする
こちらの方法は、ポップアップが全画面表示になってしまい、
ポップアップとして機能しなくなってしまいます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/08 23:46