[翻译]  Animation lags on device, but not in Simulator

[CHINESE]  动画滞后于设备,但不在模拟器中


I want to trigger a CAAnimation with a Button. In playground and in the simulator, this works exactly as I want it to. However, when I run the same code on a device, the animation happens only after a short delay.

我想用Button触发CAAnimation。在游乐场和模拟器中,这完全符合我的要求。但是,当我在设备上运行相同的代码时,动画仅在短暂延迟后发生。

Apparently, the issue only happens on iOS 11.2.6. I updated my device and can now not reproduce the issue anymore. Can anyone confirm, or find out, how it would work on iOS 11.2.6?

显然,这个问题只发生在iOS 11.2.6上。我更新了我的设备,现在无法重现该问题。任何人都可以确认或了解它如何在iOS 11.2.6上运行?

import UIKit

class MyViewController : UIViewController {
    let animatedView = UIView()

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        // Add a button
        let button = UIButton(type: .system)
        button.frame = CGRect(x: 150, y: 200, width: 200, height: 50)
        button.setTitle("Animate", for: .normal)
        button.addTarget(self, action: #selector(tap), for: .touchUpInside)

        // Set color and frame of the view, that is animated.
        animatedView.backgroundColor = UIColor.blue
        animatedView.frame = CGRect(x: 50, y: 50, width: 50, height: 50)

        // Add the views to the view hierarchy
        view.addSubview(animatedView)
        view.addSubview(button)
        self.view = view
    }

    /// On Tap create an animation, that changes the position of the animated view.
    @objc func tap() {
        let originalY = animatedView.layer.position.y
        let animation = CABasicAnimation(keyPath: "position.y")
        animation.fromValue = originalY
        animation.toValue = 300.0
        animation.duration = 1.0
        animatedView.layer.add(animation, forKey: "positionAnimation")
    }
}

1 个解决方案

#1


0  

Can you try this code with iOS 11.2.9, I have tested your code and it's working fine.

你可以尝试使用iOS 11.2.9这个代码,我测试了你的代码,它工作正常。

// MARK: Animations
public extension CALayer {

    var ani: CAAnimation {
        let startPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint))
        startPointAnim.fromValue = CGPoint(x: 0, y: 0.0)
        startPointAnim.toValue = CGPoint(x:0, y: 300)

        let endPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.endPoint))
        endPointAnim.fromValue = CGPoint(x: 0, y: 0)
        endPointAnim.toValue = CGPoint(x:2, y: 300)

        let animGroup = CAAnimationGroup()
        animGroup.animations = [startPointAnim, endPointAnim]
        animGroup.duration = 1.0
        animGroup.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)            
        return animGroup
    }

    func playAnimation(_ anim: SkeletonLayerAnimation, key: String) {
        recursiveSearch(inArray: skeletonSublayers,
                        leafBlock: { add(anim(self), forKey: key) }) {
                            $0.playAnimation(anim, key: key)
        }
    }

    func stopAnimation(forKey key: String) {
        recursiveSearch(inArray: skeletonSublayers,
                        leafBlock: { removeAnimation(forKey: key) }) {
                            $0.stopAnimation(forKey: key)
        }
    }
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2018 ITdaan.com 粤ICP备14056181号