测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2014年12月 |
由Nick Donaldson,Michael Gorbach,Alex Rouse维护。
RZTweenSpirit 是一个 iOS 库,可用于基于时间线变量的分段插值,适用于动画时间线。
什么是插值?
中间插值或插值是生成两个图像之间的中间帧的过程,以使第一幅图像平滑地演变到第二幅图像。中间帧是关键帧之间的绘图,有助于创建动作的错觉。插值是所有类型动画的关键过程,包括计算机动画。
维基百科
RZTweenSpirit 在脚本动画时间线时非常出色,但它还可以做很多事情。
让我们看看一个简单的例子
// Create an animator
RZTweenAnimator *tweenAnimator = [[RZTweenAnimator alloc] init];
// Use a float tween to animate the opacity of a label from 0 to 1 over 10 seconds with an eased-out curve
RZFloatTween *labelAlpha = [[RZFloatTween alloc] initWithCurveType:RZTweenCurveTypeSineEaseOut];
[labelAlpha addKeyFloat:0.0 atTime:0.0];
[labelAlpha addKeyFloat:1.0 atTime:10.0];
[tweenAnimator addTween:arrowAlpha forKeyPath:@"alpha" ofObject:self.titleLabel];
// Use a point tween to animate the center of the label between three points with a linear curve
RZPointTween *labelCenter = [[RZPointTween alloc] initWithCurveType:RZTweenCurveTypeLinear];
[labelCenter addKeyPoint:CGPointMake(100, 100) atTime:0.0];
[labelCenter addKEyPoint:CGPointMake(400, 100) atTime:6.0];
[labelCenter addKeyPoint:CGpointMake(200, 400) atTime:10.0];
[tweenAnimator addTween:labelCenter forKeyPath@"center" ofObject:self.titleLabel];
// You can set the time on the animator directly to jump immediately to the corresponding values in the timeline
// This is super useful for "scrubbing" the timeline in response to, say, a scrollview being scrolled
[tweenAnimator setTime:0];
// You can animate the timeline from its current point to another point
[tweenAnimator animateToTime:10.0];
// You can also animate to another point in a specific duration.
// It helps to think of "time" as more of an offset along the timeline than a specific instant measured in seconds.
[tweenAnimator animateToTime:10.0 overDuration:20.0]; // (half speed if starting at 0)
在许多情况下,CoreAnimation 可能比 RZTweenSpirit 是更好的选择。如果您需要一个可靠、经过验证的动画系统,CoreAnimation 一定是您的选择。但如果您正在寻找一种更具有表现力的方式来创建动画时间线,您可能会发现 RZTweenSpirit 非常有用!
RZTweenSpirit 支持 iOS 7.0+。
将 Classes
目录中的所有文件复制到您的项目中。还需要连接到 QuartzCore
,但应该通过文件头中使用框架模块隐式完成。
首先,导入 RZTweenSpirit.h
标头。然后,分配并初始化一个 RZTweenAnimator
实例,并在视图控制器或视图中将其保存在属性中
self.tweenAnimator = [[RZTweenAnimator alloc] init];
这就完成了,您现在可以开始制作一些插值动作了!
实现 RZTween
协议的对象(以下称为“插值”)具有在时间线沿着特定点的返回值的简单能力。协议中只有两种方法
+ (Class)valueClass;
RZKeyFrameTween
一样。- (id)tweenedValueAtTime:(NSTimeInterval)time;
valueClass
返回的类型的一个值。尽管名称如此,缓动不一定必须在不同值之间进行插值。它们可以为特定的时间范围简单地返回一个单个值。
注意:实现RZTween
的类还必须实现NSCopying
,因为它们将作为动画器内部字典中的键使用。
提供的RZTween
的主要具体实现是RZKeyFrameTween
,它提供了在时间线上的特定瞬间之间进行缓动,并可选使用缓动曲线的键帧值的工具。有关具体子类型,请参阅RZKeyFrameTweens.h
,这些子类型对应于不同的数据类型。
CGFloat
(包装在NSNumber
中)BOOL
(包装在NSNumber
中)CGRect
(包装在NSValue
中)CGPoint
(包装在NSValue
中)UIColor
动画器是一个使用来管理驱使缓动的时间线的对象。它可以通过直接设置时间来异步“刮擦”时间线,或者将动画从时间线上的一个点移动到另一个点。
实现RZTween
的对象可以通过两种方式之一注册到动画器中:KVC或基于块。
KVC方法接受一个keypath和一个keypath将修改的对象
[self.tweenAnimator addTween:myRectTween forKeypath:@"frame" ofObject:self.myView];
这也适用于CALayer转换keypaths,当使用分开的缓动时,它们仍然可以很好地一起工作
// Tween which represents rotation angle (around z-axis) in radians
[self.tweenAnimator addTween:myRotationTween forKeypath:@"transform.rotation" ofObject:self.myView.layer];
// Tween which represents translation as a CGPoint
[self.tweenAnimator addTween:myTranslationTween forKeypath:@"transform.translation" ofObject:self.myView.layer];
基于块的方法接受一个块,该块将接收缓动的引用和缓动的当前值
// Must use a weak self reference within these blocks to avoid a retain cycle,
// if the animator is retained by self.
__weak typeof(self) weakSelf = self;
// Note that the second argument of the block can be cast upwards from id
// to whatever type the tween returns as a value
[self.tweenAnimator addTween:myTween withUpdateBlock:^(id<RZTween> tween, NSNumber *value) {
weakSelf.someConstraint.constant = [value floatValue]; // must unbox NSNumber/NSValue
NSLog(@"Updated constraint constant to: %@", value);
}];
一旦注册了缓动,可以直接设置动画器的时间偏移量,或者将其动画到特定的时间点。
因为RZTween
协议以及整个RZTweenSpirit架构是动态类型的,你可以为任何东西创建缓动。
可能性是无限的!
对于更完整的文档,请参阅CocoaDocs页面。
有关示例,请参阅示例项目。
RZTweenSpirit遵循MIT许可。有关详细信息,请参阅LICENSE
。