UIView 过渡动画不执行

UIView transition animation not executing

我正在尝试在 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})

    }

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

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

尝试用 coreView.alpha = 0 替换 coreView.isHidden = true 并在动画块中替换 coreView.isHidden = falsecoreView.alpha = 1

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

这不起作用,因为在 viewWillAppear 方法完成之前没有正确设置 coreView,因此您不能使用过渡动画(您可以为其他属性设置动画,例如 alpha)。

你能做的是:

DispatchQueue.main.async {
    coreView.isHidden = false

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

}

这会将转换分派回主队列,并在 viewWillAppear 方法完成并且正确设置 coreView 后触发。

顺便记住,只要视图控制器进入视图,就会调用 viewWillAppear,因此如果它隐藏并且 returns 您将添加另一个 coreView。

将您的转换代码移至 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})    
}