4

In my custom presentation transition I've created a new view controller which will pre presented on top of the current active view controller (see screenshot). Somehow there's a shadow behind the blue view controller and I have no idea where it's coming from. Is there a way to stop getting that shadow?

The project is completely empty and has only 2 empty view controllers.

This is the code I'm using:

class ViewController: UIViewController {

    let transitionDelegate = TransitionManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .yellowColor()

        let button = UIButton(type: .System)
        button.frame = CGRectMake(10, 10, 50, 50)
        button.addTarget(self, action: "test:", forControlEvents: .TouchUpInside)
        button.backgroundColor = UIColor.redColor()

        view.addSubview(button)
    }

    func test(sender: UIButton) {
        let destination = UIViewController()
        destination.view.backgroundColor = .blueColor()

        destination.transitioningDelegate = transitionDelegate
        destination.modalPresentationStyle = .Custom
        presentViewController(destination, animated: true, completion: nil)
    }
}

The code for presenting the view:

class PresentingTransition: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.3
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let presented = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let container = transitionContext.containerView()!
        let durations = transitionDuration(transitionContext)

        presented.view.alpha = 0

        container.addSubview(presented.view)

        UIView.animateWithDuration(durations, animations: { presented.view.alpha = 1 }) { transitionContext.completeTransition($0) }
    }
}

The code for handling the presenting view controller:

class PresentationController: UIPresentationController {

    var background: UIView!

    override init(presentedViewController: UIViewController, presentingViewController: UIViewController) {
        super.init(presentedViewController: presentedViewController, presentingViewController: presentingViewController)

        prepareBackground()
    }

    func prepareBackground() {
        self.background = UIView(frame: presentingViewController.view.bounds)

        let blur = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
        blur.frame = background.bounds
        blur.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]

        background.addSubview(blur)

        let tapRecognizer = UITapGestureRecognizer(target: self, action: "backgroundTapped:")
        background.addGestureRecognizer(tapRecognizer)
    }

    func backgroundTapped(tapRecognizer: UITapGestureRecognizer) {
        presentingViewController.dismissViewControllerAnimated(true, completion: nil)
    }

    override func presentationTransitionWillBegin() {
        let container = containerView!

        background.frame = container.bounds
        background.alpha = 0.0

        container.insertSubview(background, atIndex: 0)

        presentedViewController.transitionCoordinator()?.animateAlongsideTransition({ _ in self.background.alpha = 1.0 }, completion: nil)
    }

    override func dismissalTransitionWillBegin() {
        presentedViewController.transitionCoordinator()?.animateAlongsideTransition({ _ in self.background.alpha = 0.0 }, completion: nil)
    }

    override func frameOfPresentedViewInContainerView() -> CGRect {
        return containerView!.bounds.insetBy(dx: 100, dy: 100)
    }

    override func containerViewWillLayoutSubviews() {
        background.frame = containerView!.bounds
        presentedView()!.frame = frameOfPresentedViewInContainerView()
    }
}

View presented

Henny Lee
  • 2,970
  • 3
  • 20
  • 37

0 Answers0