SwiftyJD
SwiftyJD

Reputation: 5461

UIView transition animation not executing

I'm trying to use an animation transition for when a UIView appears on screen. The UIView appears correctly but the animation doesn't occur when it appears.

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let coreView = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
    coreView.backgroundColor = UIColor.cyan
    coreView.layer.borderColor = UIColor.darkGray.cgColor
    coreView.layer.borderWidth = 8
    coreView.layer.cornerRadius = 15
    coreView.isHidden = true
    self.view.addSubview(coreView)

    //The transition occurs here
    UIView.transition(with: coreView, duration: 2, options: [.curveEaseInOut, .transitionCurlDown], animations: {

      coreView.isHidden = false
    }, completion: {_ in})

    }

Upvotes: 2

Views: 4872

Answers (4)

lakum vishal
lakum vishal

Reputation: 21

Move your transition code to viewDidAppear

override func viewDidAppear(_ animated: Bool) {
//The transition occurs here
UIView.transition(with: coreView, duration: 2, options: [.curveEaseInOut, .transitionCurlDown], animations: {        
    coreView.isHidden = false
}, completion: {_ in})    
}

Upvotes: 1

Upholder Of Truth
Upholder Of Truth

Reputation: 4711

This isn't working because coreView is not properly setup until after the viewWillAppear method completes so you can't use the transition animation (you can animate other properties like the alpha).

What you can do is this:

DispatchQueue.main.async {
    coreView.isHidden = false

     UIView.transition(with: coreView, duration: 2, options: [.curveEaseInOut, .transitionCurlDown], animations: {
    }, completion: {_ in})

}

This dispatches the transition back onto the main queue and it fires after the viewWillAppear method have completed and the coreView is properly setup.

By the way remember that viewWillAppear is called whenever the view controller is comes into view so if it hides and returns you will add another coreView.

Upvotes: 2

Asad Javed
Asad Javed

Reputation: 273

Instead of manipulating isHidden property of the coreView use the alpha property.

Try replacing coreView.isHidden = true with coreView.alpha = 0 and in the animation block replace coreView.isHidden = false with coreView.alpha = 1

That should be it I guess. It should animate. Thanks.

Upvotes: 5

badhanganesh
badhanganesh

Reputation: 3464

Try adding self.view.layoutIfNeeded() after your coreView hiding code in the animation block.

Upvotes: 0

Related Questions