CABasicAnimation

CABasicAnimation

2023年7月14日发(作者:)

CABasicAnimation背景展⽰个提⽰,像跑马灯. 最近要做这样的事情。乍⼀看,简单,但是:做法跑马灯,本质上就是⼀个位移动画,那⾃然是CABasicAnimation 和它的封装e,本⽂主要看看CABasicAnimation⾸先指定需要动画的属性let positionAnimation = CABasicAnimation(keyPath:"position.x")然后设置起始值和终⽌值lue = e = -leftOffset最后是设置时间将动画加到label上on = (positionAnimation, forKey: animKey)跑起来,发现看到的效果总是不对。⽂字并不是从制定的位置开始运动的找问题既然是看到的效果不对,那就看看负责显⽰动画的presentation layer层的位置是什么样⼦的我们在每次执⾏动画前打印看⼀下:tation()?.frame, 这是它的presentationLayer的frame多次运⾏动画得到如下结果rame: Optional((0.0, 0.0, 23.0, 9.0))frame: Optional((-337.55, 0.0, 525.0, 9.0))frame: Optional((-270.14, 0.0, 433.0, 9.0))frame: Optional((-510.49657133221626, 0.0, 751.0, 9.0))frame: Optional((-306.79565209150314, 0.0, 525.0, 9.0))frame: Optional((-235.69693331420422, 0.0, 433.0, 9.0))frame: Optional((-403.6, 0.0, 751.0, 9.0))frame: Optional((-282.75428069382906, 0.0, 525.0, 9.0))frame: Optional((-177.64594815671444, 0.0, 341.0, 9.0))frame: Optional((-236.26, 0.0, 433.0, 9.0))frame: Optional((-462.53, 0.0, 751.0, 9.0))可以看到当动画开始的时候负责显⽰的presentation layer的位置并不是0,这样处理的结果是,每次我们的跑马灯都是从左侧很远的地⽅开始滚动,不是我们想要的效果

⾃然我的第⼀个想法:就是开始动画前把动画都移除掉de = .AllAnimations()但是发现不⾏,动画依然是从label中间某个位置开始运动于是猜想是每次动画开始时label的实际的位置不对,我开始修改每次的起始位置,每次动画前⼿动将label的位置置为0,每次结束后,将label的位置复原;还找是不是每次动画还没有结束就开始新动画导致动画叠加导致的.然⽽都没有得到正确结果。怎么办,只能看看现有的跑马灯是怎么做的,于是我在之前⼤神写的代码⾥发现了某个和我⼀样(⽐我⾼级多了的代码)⾥发现了跑马灯发现转机代码中是使⽤这样的⽅式:将动画的kaypath变为ation:

CABasicAnimation(keyPath:"ation")这个时候,我们需要将fromValue 和toValue都设置成 NSValue对象,对象⾥包含的是⼀个NSSize 或者 CGSize 的数据类型.⽤来表⽰x 和 y 坐标轴的转换.

同样,我们两个维度的变换可以变成⼀个维度的,也就是说keyPath设置成ation.x也⾏。只是对应的fromValue 和toValue 设置成NSNumber对象。毕竟是⼤神,⽤这样的代码,动画正常了,每次都从最左侧开始运动了。这两种⽅式下每次启动动画的时候也不需要移除之前的动画。例如不需要以下的代码AllAnimations()当然因为是跑马灯所以填充模式和是否移除这两句话也不需要了de = .vedOnCompletion = false原因话说回来: position.x 和ation有什么区别参考官⽅⽂档CATransform3D Key PathsYou can use the enhanced key path support to retrieve specific transformation values for a property that containsa CATransform3D data type. To specify the full key path for a layer’s transforms, you would use the stringvalue transform or sublayerTransform followed by one of the field key paths in Table C-2. For example, to specify a rotationfactor around the layer’s z axis, you would specify the key

CGPoint Key PathsIf the value of a given property is a CGPoint data type, you can append one of the field names in Table C-3 to the property toget or set that value. For example, to change the x component of a layer’s position property, you could write to the

对于我的整个label的运动来说,动画是加在layer层的,我的位移⽤的也是整个frame的位移,不是⼀个点。所以应该使⽤translation来指定动画的属性

发布者:admin,转转请注明出处:http://www.yc00.com/news/1689331736a231131.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信