你的位置:首页 > 操作系统

[操作系统]iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏


    1.使用CAReplicatorLayer制作等待动画

    CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABasicAnimation制作的等待转圈动画,还有一个是利用CAShapeLayer制作的随移动距离而渐变的按钮动画,而这次要制作的圆点缩放动画用到的是CAReplicatorLayer,CAShapeLayer与CAReplicatorLayer都是CAlLayer的子类,根据不同应用场景,可以使用不同的layer来满足要求。

    动画效果如图:

 

 

    实现过程,画一个圆,复制三份,添加动画效果即可

 

     (1)CAReplicatorLayer之anchorPoint与position之间的关系

    在制作动画前,需要弄清楚anchorPoint与position之间的关系,对最终将动画渲染在屏幕上的位置至关重要。

   ①position:CAReplicatorLayer的position决定了其在父视图中位置坐标。

   ②anchorPoint:CAReplicatorLayer的anchorPoint决定了其position的位置。

    anchorPoint的默认值为(0.5, 0.5),此时CAReplicatorLayer在父视图中坐标位置对应其中心点的坐标。

    而如果想使用父视图一样坐标系标准,即像添加普通的view一样设置坐标,而不用去考虑计算position在CAReplicatorLayer中心点带来的影响,将anchorPoint设置为(0, 0)即可,此时position的位置在CAReplicatorLayer的左上角顶点

    

     (2)CAReplicatorLayer的相关重要参数

    ①instanceCount,CAReplicatorLayer中子元素的份数,

    ②instanceDelay,CAReplicatorLayer中子元素动画执行时延迟时间,

    ③instanceTransform,CAReplicatorLayer中子元素形变方式,本例中主要就是X轴方向平移复制。

     (3)初始化CAReplicatorLayer

     如图所示进行相关初始化,animationDuration为动画执行一次的总时间,animationInstanceCount为拷贝后子元素的个数, instanceDelay = animationDuration / animationInstanceCount 是为了让动画看起来具有连续性

     circle为动画中的小圆点,anchorPoint采用默认值,小圆点的中心刚好在animationContainerView的边界上,由于需要和animationContainerView边界左对齐,所以把圆点circle往右移动了一个半径的距离,如下图所示,左图为不设置偏移的情况,右图为设置偏移后的情况。

     (4)添加和移除动画效果

       autoreverses这个参数默认为NO,这里设置为YES,目的是重复执行动画时,一次动画执行完毕后,下一次动画执行相反的效果,即这一次圆点执行缩小的动画效果,下一次执行放大的动画效果,这样循环往复,让动画更具连续性,而不是缩小后突兀的就恢复原来大小。

    2.强制更新

      苹果审核时不允许带有版本检测强制更新功能,如果需要加上强制更新功能以备不时之需,就需要提前设置好。

      方法之一是:在某一时刻请求后台接口,检测是否需要强制更新,例如applicationDidBecomeActive的时候,接口中约定好一个关于开启强制更新的变量以及相关版本号,当需要强制更新时,通过检测该变量及比较版本号即可通过弹框方式提醒甚至强制用户去升级,当然这不是一个好的体验。

    3.远程推送加语音提醒

      之前博客记录了关于远程消息推送的东西,这次要在远程消息推送基础上加语音提示,语音提示主要是为了更方便的提示用户接收推送信息,例如商家收到美团外卖订单时,店内会听到新订单的语音提示,提醒商家接单。加语音提示主要有以下几个关键点:

     (1)工程相关准备,音频文件及相关类库

      在工程里预先存放语音提示的音频文件,供接收消息时播放,文件格式必须为aiff、wav或caf之一,这里将音频文件存为了wav格式使用,且音频文件播放时长需要控制在30秒以内,否则将自动被替换为默认语音提示。

     本例中使用AVAudioPlayer播放音频文件,所以需要引入AVFoundation.framework

     (2)后台推送消息格式

       在aps信息里的sound对应工程里存放的音频文件名,注意后缀,本例中sound对应的文件名没有加入后缀,而是在代码中给音频文件添加后缀。

     (3)注意将AVAudioPlayer实例以属性方式声明

      之前在函数中以临时变量方式声明AVAudioPlayer并播放音频文件,一直没有声音,后来发现是还没有来得及播放,AVAudioPlayer实例就已经被释放了,以属性方式声明后解决此问题,相关代码如下

     (4)音量

      仔细辨认可以发现,app在前台运行时收到推送消息播放语音提示的声音是要略大于app在后台运行时收到推送消息播放语音提示的声音,因为AVAudioPlayer控制的音量是在系统音量的级别上来进行调整,无法调节系统音量,如果要调节系统音量,需要再单独处理,并且注意播放音频文件后将系统音量恢复成原来大小。具体参考:iOS编程修改系统音量

    4.UIView截屏

     相关代码如下所示:

    5.参考

     Core Animation Programming Guide--Core Animation Basics

     CALayer Animation - Replicator Animation

     MP3 playing using AVAudioPlayer not working on device

     iOS开发-音频播放