详解 iOS 系统中的视图动画
动画为用户界面的状态转换提供了流畅的可视化效果, 在 ios 中大量使用了动画效果, 包括改变视图位置、 大小、 从可视化树中删除视图, 隐藏视图等。 你可以考虑用动画效果给用户提供反馈或者用来实现有趣的特效。
在 ios 系统中, core animation 提供了内置的动画支持, 创建动画不需要任何绘图的代码, 你要做的只是激发指定的动画, 接下来就交给 core animation 来渲染, 总之, 复杂的动画只需要几行代码就可以了。
哪些属性可以添加动画效果
根据 ios 视图编程指南中说明, uiview 内置支持为下列属性添加动画效果:
- frame 可以改变视图相对于上一级视图的位置和大小。 (如果视图已经经过了缩放、 旋转、平移之类的变换, 则需要修改 center 和 bounds 属性)
- bounds 改变视图大小。
- center 改变视图相对于上级视图的位置。
- transform 相对于中心点进行视图缩放、旋转和平移, 这个属性只能进行二维转换。 (如果要进行三维转换, 则必须用 coreanimation 操作视图的 layer 属性。)
- alpha 改变视图的透明度。
- backgroundcolor 修改视图的背景色。
- contentstretch 改变视图内容在视图的可用空间内的拉伸方式。
为视图的属性变化添加动画
为了给属性的变化添加动画效果, 需要把修改这些属性的代码放到指定的动画代码段 (animation block) 中。 只有在动画代码段中修改支持动画的属性, 才能添加动画效果。
使用 begin/commit 方法做动画
在 ios 3.0 以及之前的系统中, 必须使用 uiview 的类方法 beginanimations:context: 和 commitanimations 来定义动画代码段, 在 begin 和 commit 之间的代码会在特殊的动画线程中运行, 因此不会阻塞主线程, 比如说要切换两个视图, 代码应该是这样子的:
在 xamarin.ios (monotouch) 平台下, begin/end 方法对应的绑定为:
- public static void beginanimations (string animation)
- public static void beginanimations (string animationid, intptr context)
- public static void commitanimations ()
上面的切换视图的 c# 版本代码为:
在 begin/commit 函数之间, 可以通过下面的方法设置动画的参数和选项:
- setanimationstartdate:
- setanimationdelay:
- setanimationduration:
- setanimationcurve:
- setanimationrepeatcount:
- setanimationrepeatautoreverses:
- setanimationdelegate:
- setanimationwillstartselector:
- setanimationdidstopselector:
- setanimationbeginsfromcurrentstate:
注意: 如果不是为了支持很旧的设备, 则推荐使用下面的 lambda (block based method) 来实现动画效果, 虽然 begin/commit 还能够使用, 按照官方的说法, 对新系统来说是不推荐的了。
使用 lambda (block based method) 做动画
在 ios 4.0 以后, 引入了代码块 (code block) 的概念, 可以使用代码块来初始化动画, 这也是在 ios 4.0 之后苹果推荐的做法, ios sdk 提供的 api 如下:
- animatewithduration:animations:
- animatewithduration:animations:completion:
- animatewithduration:delay:options:animations:completion:
而在 xamarin.ios (monotouch) 平台下, 这些方法被绑定为下列方法:
- public static void animate(double duration, nsaction animation)
- public static void animate (double duration, nsaction animation, nsaction completion)
- public static void animate (double duration, double delay, uiviewanimationoptions options, nsaction animation, nsaction completion)
还是切换视图的动画, 如果用 objective-c 的代码块来实现, 则应该是这样子的:
如果用 c# 来实现的话, 应该是这样:
这样就实现了一个简单的渐变动画, 并且只能运行一次, 通常不能满足需求, 再来一个复杂点儿的:
对应的 c# 代码如下:
嵌套动画
ios 支持嵌套的动画, 也就是说在一个动画代码段中, 可以再开始另外一个动画代码段, 而不必等当前动画完成, 嵌套的动画会同时开始运行, 默认继承原来动画的延时、 时间长度、 加速曲线等, 不过这些选项也能被覆盖。 例如:
对应的 c# 代码如下:
对于使用 begin/commit 方法的动画, 也可以嵌套调用 begin/commit 方法来实现嵌套的动画, 例如:
这段 c# 代码对应的 objc 代码很简单, 就不写出来了。
实现动画的自动翻转
当创建自动翻转指定次数的动画时, 考虑将重复次数设置为非整数值。 因为对于自动翻转的动画来说, 每次循环都是从原始值变化到目标值再变化回原始值, 如果希望动画结束之后停留在目标值, 需要将重复次数设置加上 0.5 , 否则, 动画回慢慢变回原始值, 再迅速变化到目标值, 这可能不是原来期望的动画效果。
创建视图切换动画
视图切换动画可以减少修改可视化树时引起的界面上的突变, ios 系统中大量使用了视图切换动画, 视图切换动画主要有下面两种场景:
- 修改子视图
- 替换子视图
注意: 不要把视图切换和视图控制器的切换混淆(显示一个模式对话框、将视图控制器推入导航堆栈等), 视图切换改变的仅仅是视图的可视化树, 视图控制器是不变的, 更多信息可以参考ios视图控制器编程指南。
修改子视图
可以修改子视图的可见性用来表示当前视图的不同的状态, 看下面的两个视图切换的例子,在 ios 4.0 之前, 需要将视图切换动画添加到 begin/commit 动画之间, 代码如下:
在 ios 4.0 之后, 可以使用 transitionwithview:duration:options:animations:completion:
这里只有动画部分的代码, 动画完成之后请参考 setanimationdelegate: 方法设置并实现 uianimationdelegate 。
替换子视图
要进行子视图的替换, 需要用到 transitionfromview:toview:duration:options:completion: 方法, 示例代码如下:
链接多个动画
有了上面的知识, 链接多个动画就非常简单了:
- 对于 lambda 或 block-based 方法的动画, 使用 complete 回调函数即可;
- 对于 begin/commit 方法的动画, 需要实现一个 uianimationdelegate , 然后调用 setanimationdelegate 方法设置 delegate 即可。
以上就是详解 ios 系统中的视图动画的详细内容,更多关于ios 视图动画的资料请关注其它相关文章!
推荐阅读
-
Win10 Version 1607中的Linux子系统安装方法详解
-
详解iOS应用的设计模式开发中Mediator中介者模式的使用
-
详解iOS应用开发中使用设计模式中的抽象工厂模式
-
详解iOS App中图片的线段涂鸦功能的添加方法
-
详解iOS中position:fixed吸底时的滑动出现抖动的解决方案
-
Android中ViewFlipper的使用及设置动画效果实例详解
-
详解iOS App开发中改变UIButton内部控件的基本方法
-
ubuntu系统中/etc/rc.local和/etc/init.d/rc.local的区别详解
-
oracle中的视图详解
-
详解Linux系统中ls和dir命令的组合使用