Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了实现脉冲雷达以及动态增减元素(Swift)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

最终效果: 这效果是从MOV文件转成GIF的,而且CSDN不支持大于2M的图片上传, 优酷地址 创建基本动画 这效果是从MOV文件转成GIF的,而且CSDN不支持大于2M的图片上传,优酷地址 创建一个Single View Application工程,再创建一个Swift文件,我创建的叫“PulsingRadarView”,目前结构为: 在ViewController里面持有一个Optional的
最终效果

效果是从MOV文件转成GIF的,而且CSDN不支持大于2M的图片上传, 优酷地址@H_419_11@

创建基本动画


效果是从MOV文件转成GIF的,而且CSDN不支持大于2M的图片上传,优酷地址@H_419_11@

创建一个Single View Application工程,再创建一个Swift文件,我创建的叫“PulsingRadarView”,目前结构为:


在ViewController里面持有一个Optional的PulsingRadarView的属性,表示可以为nil,然后在viewDidLoad里做一个简单的初始化工作:

classViewController:UIViewController{

varradarView:PulsingRadarView!

overridefuncviewDidLoad() {

super.viewDidLoad()

letradarSize =CGSizeMake(self.view.bounds.size.width,)

radarView=PulsingRadarView(frame:CGRectMake(0,(self.view.bounds.size.height-radarSize.height)/2,

radarSize.width,radarSize.height))

@H_404_123@view.addSubview(radarView)

}

funcdidReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

}

雷达是圆形的,所以宽高都是self.view.bounds.size.width。

PulsingRadarView里面现在应该是空的,我们首先导入QuartzCore,因为后面动画部分会用到CALayer,然后重写drawRect方法

funcdrawRect(rect:CGRect) {

UIColor.whiteColor().setFill()

UIRectFill(rect)

letpulsingCount =6

letanimationDuration:Double=4

varanimationLayer =CALayer()

forvari =0; i < pulsingCount; i++ {

varpulsingLayer =CALayer()

pulsingLayer.frame=:rgb(61,height)

pulsingLayer.borderColor=UIColor.grayColor().CGColor

pulsingLayer.borderWidth=1

pulsingLayer.cornerRadius= rect.2

defaultCurve =CAMediaTimingFunction(name:kCAMediaTimingFunctionDefault)

varanimationGroup =CAAnimationGroup()

animationGroup.fillmode=kCAFillmodeBACkWARDs

animationGroup.beginTime=CACurrentMediaTime() +Double(i) * animationDuration /Double(pulsingCount)

animationGroup.duration= animationDuration

animationGroup.repeatCount=HUGE

animationGroup.timingFunction= defaultCurve

varscaleAnimation =CABasicAnimation(keyPath:"transform.scale")

scaleAnimation.autoreverses=false

scaleAnimation.fromValue=Double(0)

scaleAnimation.toValue=1.5)

varopacityAnimation =CAKeyframeAnimation(keyPath:"opacity")

opacityAnimation.values= [1),0.7),216)">0)]

opacityAnimation.keyTimes= [0),216)">0.5),216)">1)]

animationGroup.animations= [scaleAnimation,opacityAnimation]

pulsingLayer.addAnimation(animationGroup,forKey:"pulsing")

animationLayer.addSublayer(pulsingLayer)

}

@H_404_123@layer.addSublayer(animationLayer)

}

先设置画布的背影色为白色,pulsingCount表示波形的条数,animationDuration表示动画的时长,然后我创建了一个animationLayer来存放所有的动画Layer------pulsingLayer,这样layer的结构看起来就像:

每个pulsingLayer代表一个圆形,循环里面先对pulsingLayer进行一些初始化工作:设置frame、边框颜色、边框大小以及radius(半径),radius自然就是自身的宽或高的一半。

CAMediaTimingFunction稍后再说。

接下来创建一个AnimationGroup,因为我们需要用到的动画将有两个:scale(缩放)、opacity(透明),而且需要控制动画开始的时间。

我们借用Controlling Animation Timing这篇文章中的几张图来说明fillmode、beginTime这两个属性

以下每个方格代表1秒钟,下面这张图也就代表4秒钟,动画时间为1.5秒,黄色为动画开始,蓝色为动画结束,黄色到蓝色也就是动画的过程。从图中可以看到,蓝色部分结束后就是白色了,也就代表整个动画结束并且从layer上移除。

下面这张图开始动画时间偏移了1秒,其余不变。

认情况下,所有的Layer无论创建的先后顺序有何不同,它们的时间线都是一致的,beginTime为0,表示加入Layer之后就立即开始动画(或者说在当前时间播放动画),而如果要偏移1秒(如上图),则要CACurrentMediaTime()+1,获取当前系统的绝对时间@H_419_11@(秒数)并+1。我们要实现脉冲效果,就要使每一个animationGroup的动画以不同的beginTime来进行,所以要设置beginTime =CACurrentMediaTime() + Double(i) * animationDuration / Double(pulsingCount),Swift不支持隐式类型转换,用Double()显式的强转一下。

但是通过上图可以看到,偏移后动画开始前有一个空档,这是由fillmode决定的:

在我们现在的这种情况下,pulsingLayer是设置过frame和border的,所以在动画的空档期,pulsingLayer会直接显示一个带边框的圆形(动画还没有开始),当然,在动画播放过一次之后,这个边框就不会显示了,因为进入了正常的动画播放循环,不会出现空档期。我们只需要避免在动画播放前不出现空档期就行了,即设置fillmode =kCAFillmodeBACkWARDs(提前进入动画状态)。
repeatCount = HUGE就是字面意思,表示动画无限循环(HUGE可以认为是无限,如果是ObjC,用HUGE_VAL)。
CAMediaTimingFunction由系统预置了几个值:
  • kCAMediaTimingFunctionLinear@H_239_403@线性,即匀速
  • kCAMediaTimingFunctionEaseIn@H_239_403@先慢后快
  • kCAMediaTimingFunctionEaSEOut@H_239_403@先快后慢
  • kCAMediaTimingFunctionEaseInEaSEOut@H_239_403@先慢后快再慢
  • kCAMediaTimingFunctionDefault@H_239_403@实际效果是在动画开始时和动画播放时比较快,将结束时会变慢
CAMediaTimingFunction支持被定制。我们把timingFunction设置为kCAMediaTimingFunctionDefault,可以使动画播放的更加动感。
接下来的Scale动画就很简单了,从0(0倍)到1.5(放大1.5倍)变换即可。
Opacity透明动画只用设置values和与其对应的keyTimes就行了,需要注意的是keyTimes表示的是时间比例,取值0到1之间,如values的第一个元素为1,keyTimes第一个元素为0,表示动画开始时,opacity为1;values的第二个元素为0.7,keyTimes第二个元素为0.5,表示动画播放到一半的时候,opacity为0.7;依次类推,可自由定制。
然后将单独的scale动画与opacity动画封装到animationGroup里,在把包含了两个动画的animationGroup给pulsingLayer,animationLayer添加pulsingLayer,最后添加这个包含了所有动画Layer的animationLayer即可。

动态增减元素

:rgb(85,优酷地址@H_419_11@

动画部分已经完成了,接下来我们给PulsingRadarView增加接口,使其支持增减元素。
首先给PulsingRadarView添加两个属性

classPulsingRadarView:UIView{

letitemSize =CGSizeMake(44,216)">44)

varitems =NSMutableArray()

一个是每个item的尺寸,第二个用来存储所有的item。
添加addOrreplaceItem公共接口:
funcaddOrreplaceItem() {

let@H_5_21@maxCount =10

varradarButton =UIButton(frame::rgb(61,itemSize.height))

radarButton.setImage(UIImage(named:"UK"),forState:UIControlState.Normal)

center =generateCenterPoinTinRadar()

radarButton.center=CGPointMake(center.x,center.y)

self.addSubview(radarButton)

items.addObject(radarButton)

ifitems.count> maxCount {

varview =objectATindex(0)asUIView

view.removeFromSuperview()

removeObject(view)

}

}

大佬总结

以上是大佬教程为你收集整理的实现脉冲雷达以及动态增减元素(Swift)全部内容,希望文章能够帮你解决实现脉冲雷达以及动态增减元素(Swift)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。