我想用Button触发CAAnimation.在游乐场和模拟器中,这完全符合我的要求.但是,当我在设备上运行相同的代码时,动画仅在短暂延迟后发生.
显然,这个问题只发生在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") } }
Can you try this code with iOS 11.2.9,I have tested your code and it’s working fine.
// 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) } } }