2017-06-06 68 views
0

我试图在UIView出现在屏幕上时使用动画过渡。 UIView正确显示,但是动画在出现时不会发生。UIView过渡动画没有执行

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}) 

    } 

回答

0

这是行不通的,因为在viewWillAppear方法完成之前,CoreView没有正确设置,因此您无法使用过渡动画(您可以使用其他属性(如alpha)进行动画制作)。

你可以做的是这样的:

DispatchQueue.main.async { 
    coreView.isHidden = false 

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

} 

这分派过渡返回到主队列,它激发了viewWillAppear中方法已经完成并且coreView正确设置。

顺便记住,viewWillAppear是每当视图控制器进入视图时调用,所以如果它隐藏并返回,您将添加另一个coreView。

+0

就这样做了!它现在工作:) – SwiftyJD

0

尝试在动画块你coreView隐藏代码之后加入self.view.layoutIfNeeded()

1

而不是操纵isHidden coreView属性使用alpha属性。

尝试更换coreView.isHidden =真coreView.alpha = 0并在动画块替换coreView.isHidden =假coreView.alpha = 1

这应该是它我猜。它应该动画。谢谢。

+0

作为一般规则,并非所有属性都是*动画*。当UIView的属性是动画的时,它总是在文档中明确提到。 'isHidden'不是可以动画的。 – deadbeef

+0

这是一个过渡动画,可以在添加或取消层次结构时起作用。当视图被添加到故事板时它可以工作,但是由于这个视图是以编程方式创建的,所以它不起作用 – SwiftyJD