我通过向UIView添加多个图层来编写一种动画。这些图层应由脚本设置为可见或不可见。
该脚本基于实现协议的对象:
// the general protocol for a step
@protocol ActionStep
-(void) applyForTime:(int)playtime;
-(void) reset;
@end
在计时器中我遍历步骤对象:
NSEnumerator* enumerator = [ScriptObjects objectEnumerator];
id obj;
while ( obj = [enumerator nextObject] )
{
id <ActionStep> step = obj;
[step applyForTime:currentmilliseconds];
}
一个脚本对象就是这个对象:
@interface LayerStep : NSObject <ActionStep>
{
int mTimeOffset;
CGPoint mOffset;
float mAlpha;
LayerObject* mTheLayer;
bool mPrepared;
}
-(id)initWithLayerObject: (LayerObject*) theLayer Milliseconds:(int) milliseconds Offset:(CGPoint) offset Alpha:(float)alpha;
@end
最后我在图层中实现了协议:
-(void) applyForTime:(int)playtime
{
if ( mPrepared ) // has the step already been executed?
{
if ( playtime >= mTimeOffset )
{
[mTheLayer setAlpha:mAlpha]; // AssignedLayer.opacity = alpha;
[mTheLayer setPosition:mOffset]; // AssignedLayer.position = offset;
mPrepared = false;
}
}
}
在步骤中应用更改会导致转换。
有没有办法禁用此转换?我现在没有使用任何CoreAnimation调用,只是属性本身(参见代码)。
答案 0 :(得分:36)
更改图层的“动画”属性之一会创建Apple的文档调用隐式动画。
引用有关该主题的Xcode文档:
Core Animation的隐式动画模型假定所有更改都是 动画层属性应该是渐进的和异步的。 动态动画场景可以在没有明确的情况下实现 动画层。更改可设置动画的图层属性的值 使图层隐式地为旧值的变化设置动画 到了新的价值。动画正在播出时,设置一个新动画 目标值会导致动画过渡到新的目标值 从现在的状态。
在幕后,系统会生成一个进行更改的CAAnimation。
正如另一张海报所说,你可以使用setAnimationDuration让动画瞬间发生,这样可以关闭动画效果。我怀疑系统仍会生成动画。
关闭隐式图层动画的官方方法是使用
[CATransaction begin];
[CATransaction setDisableActions: YES];
//layer changes
[CATransaction commit];
在Swift 3中,此代码如下所示:
CATransaction.begin()
CATransaction.setDisableActions(true)
//layer changes
CATransaction.commit()
答案 1 :(得分:3)
将代码包装在您进行更改的位置。
[CATransaction begin];
[CATransaction setAnimationDuration:0];
[thelayer setAlpha:0];
[CATransaction commit];