iOS中的显示动画(属性动画)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中的显示动画(属性动画)相关的知识,希望对你有一定的参考价值。
参考技术A 当更新属性的时候,我们需要设置一个新的事务,并且禁用图层行为。否则动画会发生两次,一个是因为显示的CABasicAnimation,另一个是因为隐式动画。动画本身会作为一个参数传入委托的方法,也许你会认为可以控制器中把动画存储为一个属性,然后在回调用比较,但实际上不起作用,因为委托传入的动画参数是原始值的一个深拷贝,从而不是同一个值。CAAnimation实现了KVC协议。但是CAAnimation有一个不同的性能:它更像是一个NSDictionary,可以让你随意设置键值对,即使和你使用的动画所声明的属性并不匹配。
CABasicAnimation揭示了大多数隐式动画背后依赖的机制,但是显示的给图层添加CABasicAnimation相较于隐式动画而言,费力不讨好。
CAKeyframeAnimation同样是CAPropertyAnimation的一个子类,它依然作用于单一的一个属性,但是和CABasicAnimation不一样的是,它不限制于设置一个起始和结束的值,而是可以根据一连串随意的值来做动画。
CAKeyframeAnimation并不能自动把当前值作为第一帧。动画会在开始的时候突然跳到第一帧的值,然后在动画结束的时候恢复到初始值。
CAKeyframeAnimation有另一种方式去指定动画,就是使用CGPath。path属性可以用一种直观的方式,使用CoreGraphics函数定义运动序列来绘制动画。可以使用一个三次倍赛尔曲线,它是一种使用开始点,结束点和另外两个控制点来定义形状的曲线。
属性动画实际上是针对于关键路径而不是一个键,这就意味着可以对子属性甚至是虚拟属性做动画。
为了旋转图层,我们可以对transform.rotation关键路径应用动画,而不是transform本身。
用transform.rotation而不是transform做动画的好处:
可以不通过关键帧一步旋转多于180度的动画;
可以用相对值而不是绝对值旋转;
可以不用创建CATransform3D,而是使用一个简单的数值来指定角度。
不会和transform.position或者transform.scale冲突。
transform.rotation属性其实并不存在。这是因为CATransform3D并不是一个对象,实际上是一个结构体,也没有符合kvc相关属性,transform.rotation实际上是一个CALayer用于处理动画变换的虚拟属性。
不可以直接设置transform.rotation或transform.scale,他们不能直接使用。当对他们做动画时,CoreAnimation自动地根据通过CAValueFunction来计算的值更新transform属性。
UIScrollView iOS 应用程序中的动画
【中文标题】UIScrollView iOS 应用程序中的动画【英文标题】:Animation in UIScrollView iOS app 【发布时间】:2013-12-09 14:20:55 【问题描述】:我正在开发一个 iOS 应用程序,我有一个全屏 UIScrollView,顶部有一个 UIImageView,底部有 2 个 UIButton。
当用户滚动时,我想在图像视图上插入动画(可能只是逐渐更改 alpha 参数)。
动画与scrollview相关,例如,如果用户滚动scrollview一半,将只显示一半动画。
我希望我自己解释一下。
我该怎么做?
【问题讨论】:
【参考方案1】:使用UIScrollViewDelegate scrollViewDidScroll:
方法。
https://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html#//apple_ref/occ/intfm/UIScrollViewDelegate/scrollViewDidScroll:
但还要检查该委托中的其他方法。
因此,例如,您最终可能会得到类似(或根据您的需要更改):
-(void)scrollViewDidScroll:(UIScrollView*)scrollView
float opacity = ( 100 - scrollView.contentOffset.y ) / 100.0;
opacity = (opacity < 0? 0 : opacity>1? 1 : opacity);
imageView.layer.opacity = opacity;
您可能还想向 Apple 工程师自己学习。查看 WWDC 视频,其中有很多:
探索 iOS 7 上的滚动视图(WWDC 2013) 通过滚动视图增强用户体验(WWDC 2012) 高级 ScrollView 技术(WWDC 2011)【讨论】:
真的很喜欢,就是我要找的。但我在第 1 行有一个错误:二进制表达式(int 和 CGPoint)的操作数无效。我该如何解决? @user3072993 已修复!我错过了 scrollView.contentOffset 示例上的 .y 。如果您更喜欢它,也许您可以将其标记为您的答案。 效果很好..谢谢!有没有一种简单的方法来检测用户是向上滚动还是向下滚动?我在委托方法中看不到这一点.. @user3072993 为此,您需要计算每个委托调用之间的增量变化。这也是为什么我建议检查整个委托,而不是一个方法。您必须计算增量,并将其存储在浮点数中(如果只是垂直 y 值),然后比较 (currentOffset.y - previousY) 以查看它是 > 0(向下)还是 【参考方案2】:实现UIScrollView
Delegate协议并使用该方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
在这里,您可以通过调整视图层的不透明度来更改 UIImageView
的 alpha 值:
imageView.layer.opacity = ...
这叫做隐式动画。
【讨论】:
以上是关于iOS中的显示动画(属性动画)的主要内容,如果未能解决你的问题,请参考以下文章