>

UIView 의 애니메이션  뷰가 수퍼 뷰에 추가 된 직후에 시작되어야합니다.

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

그러나 결과는 슈퍼 뷰에서 뷰가 표시 될 때 애니메이션이 이미 끝난 것입니다. UIView.animate  애니메이션은 아니지만 self.layer.colors 를 설정합니다   didMoveToSuperview 에서 뷰가 아직 보이지 않기 때문에 즉시  호출됩니다.

애니메이션을 정상적으로 시작하려면 어떻게해야합니까?

  • 답변 # 1

    핵심 애니메이션을 사용하여 그라디언트 애니메이션은 CABasicAnimation 를 만들어 수행 할 수 있습니다  그리고 당신의 CAGradientLayer 에 추가 . 이것을 UIView 에 싸지 않아도됩니다.  애니메이션 블록과 viewDidMoveToSuperview 에서이 작업을 수행 할 수 있습니다  당신이 당신의 UIView 를 추가하면  루트 뷰가 UIWindow 에 추가 된 후 언젠가 뷰 계층에 대한 서브 클래스 인스턴스 . 예를 들어 놀이터에서 다음과 같이 쓸 수 있습니다.

    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 초 애니메이션을보고 세로 레드에서 그린 그래디언트까지 애니메이션합니다.

  • 이전 sql - substring_index MySQL을 사용하여 대시로 이름 가져 오기
  • 다음 python 3.x - Cython 스크립트에서 속도 향상을 위해 npzeros 대신 memset 사용