更改图层/视图属性时禁用动画?

Zup*_*ppa 9 iphone objective-c calayer uiview ios

我通过向UIView添加几个图层来编写一种动画.这些图层应由脚本设置为可见或不可见.

该脚本基于实现协议的对象:

// the general protocol for a step
@protocol ActionStep 
-(void) applyForTime:(int)playtime;
-(void) reset;
@end
Run Code Online (Sandbox Code Playgroud)

在计时器中我遍历步骤对象:

NSEnumerator* enumerator = [ScriptObjects objectEnumerator];
id obj;

while ( obj = [enumerator nextObject] )
{
  id <ActionStep> step = obj;
  [step applyForTime:currentmilliseconds];
}
Run Code Online (Sandbox Code Playgroud)

一个脚本对象就是这个对象:

@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
Run Code Online (Sandbox Code Playgroud)

最后我在层中实现协议:

-(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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

应用步骤中的更改会导致转换.

有没有办法禁用这种转变?我现在没有使用任何CoreAnimation调用,只是属性本身(参见代码).

Dun*_*n C 36

更改图层的"可动画"属性之一会创建Apple的文档所谓的隐式动画.

引用有关该主题的Xcode文档:

Core Animation的隐式动画模型假设对可动画图层属性的所有更改都应该是渐进的和异步的.动态动画场景可以在没有明确动画图层的情况下实现.更改可设置动画的图层属性的值会导致图层隐式地为从旧值到新值的更改设置动画.当动画正在进行中时,设置新目标值会导致动画从当前状态转换为新目标值.

在幕后,系统会生成一个CAAnimation来进行更改.

正如另一张海报所说,你可以使用setAnimationDuration让动画瞬间发生,这样可以关闭动画效果.我怀疑系统仍会生成动画.

关闭隐式图层动画的官方方法是使用

[CATransaction begin];
[CATransaction setDisableActions: YES];
//layer changes
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

编辑:

在Swift 3中,此代码如下所示:

CATransaction.begin()
CATransaction.setDisableActions(true)
//layer changes
CATransaction.commit()
Run Code Online (Sandbox Code Playgroud)