gpt4 book ai didi

ios - 为什么在添加 View 后立即启动时 UIView 动画不起作用?

转载 作者:行者123 更新时间:2023-11-28 12:20:44 28 4
gpt4 key购买 nike

UIView 的动画应该在 View 添加到父 View 后立即开始:

class myView: UIView {
override func didMoveToSuperview() {
super.didMoveToSuperview()

UIView.animate(
withDuration: duration,
delay: 0,
options: .curveLinear,
animations: {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
self.layer.colors = [color1, color2]
CATransaction.commit()
},
completion: nil
)
}
}

然而,结果是当 View 在父 View 中可见时,动画已经结束。 UIView.animate 不设置动画但立即设置 self.layer.colors,可能是因为调用 didMoveToSuperview 时 View 尚不可见。

如何让动画正常启动?

最佳答案

可以通过创建一个 CABasicAnimation 并将其添加到您的 CAGradientLayer 来使用核心动画制作渐变动画。您不需要将它包装在 UIView 动画 block 中,您可以从 viewDidMoveToSuperview 执行此操作,前提是您将 UIView 子类实例添加到在将 Root View 添加到 UIWindow 之后的某个时间查看 View 层次结构。例如,在 Playground 上可以写:

import UIKit
import PlaygroundSupport

class MyView: UIView
{
var duration = 20.0

var fromColors = [UIColor.orange.cgColor, UIColor.blue.cgColor]
var toColors = [UIColor.red.cgColor, UIColor.green.cgColor]

override func didMoveToSuperview() {
super.didMoveToSuperview()

let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
layer.addSublayer(gradientLayer)

let animation = CABasicAnimation(keyPath: "colors")
animation.fromValue = fromColors
animation.toValue = toColors
animation.duration = duration
gradientLayer.add(animation, forKey: nil)

gradientLayer.colors = toColors
}
}

class ViewController: UIViewController
{
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let myView = MyView(frame: view.bounds)
view.addSubview(myView)
}
}

PlaygroundPage.current.liveView = ViewController()

并观看从垂直橙色到蓝色渐变到垂直红色到绿色渐变的 20 秒动画。

关于ios - 为什么在添加 View 后立即启动时 UIView 动画不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866007/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com