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开发-音频播放

iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏的更多相关文章

  1. 适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue

    原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上对开发人员最糟糕的版本号了.收到非常多朋友表达同感. 之所以这么说 ...

  2. iOS开发检测是否开启定位、是否允许消息推送等权限

    1.iOS开发检测是否开启定位: 需要导入: #import <CoreLocation/CoreLocation.h> 代码如下: + (void)openLocationService ...

  3. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  4. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  5. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  6. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  7. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  8. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  9. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

随机推荐

  1. ubuntu启动器和dash里应用图标不正常

    在以下目录: /usr/share/applications~/.local/share/applications 添加或编辑(pycharm图标不正常):jetbrains-pycharm.desk ...

  2. Git 版本管理

    应用情景1:添加文件(单个.多个.目录)到Git版本库,提交一个版本快照. 应用情景2:穿越历史回到过去,版本回退,从当前版本回退到之前提交过的某个版本上. 应用情景3:穿越历史过头了,版本回退多了, ...

  3. DDD:使用EntityFramework的话,如果只为聚合根设计仓储,其它实体如何处理?

    背景 DDD中只有聚合根可以有仓储,仓储负责整个聚合持久化的相关生命周期,在不使用工作单元或POCO的情况下,我们可以让Order内部直接调用DAL操作OrderItem.我们也可以让Order跟踪所 ...

  4. Android View中的控件和监听方法...

    PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...

  5. iOS第三方类库汇总【持续更新】

    在我们平时开发中会经常使用一些第三方开发的开源类库.这样会有效地提高我们开发项目的效率,在这里我找了好几十个进行一个汇总,供大家参考使用,方便大家在需要的时候能容易找到. UI篇 awesome-io ...

  6. office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

    office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.O ...

  7. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  8. Python基础:函数

    一.概述 二.声明.定义和调用 三.参数 1.参数传递 2.实参类型 3.形参绑定 四.返回值 五.名字空间与作用域 1.基本概念 2.名字空间 3.作用域 4.总原则 六.高级 1.装饰器 2.生成 ...

  9. WPF ListView 选中问题

    WPF ListView 选中问题  摘自:http://www.cnblogs.com/BBHor/archive/2013/04/28/VisualTreeHelper-PreviewMouseD ...

  10. csharp: get Web.Services WebMethod

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...