【问题标题】:Disabling animation when changing layer/view properties?更改图层/视图属性时禁用动画?
【发布时间】:2012-04-26 16:36:17
【问题描述】:

我通过向 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 调用,只是属性本身(参见代码)。

【问题讨论】:

  • 我认为我们需要看到更多代码——例如,你是如何进行转换的? “只是属性”是什么意思?

标签: iphone objective-c ios uiview calayer


【解决方案1】:

更改图层的“动画”属性之一会创建 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()

【讨论】:

  • 是的,这看起来更有希望,也更精确。我怀疑对象属性本身有类似的东西,我仍然必须习惯于objective-c和cocoa并不能真正以OO方式工作的事实......
【解决方案2】:

只需将代码包装在您进行更改的位置即可。

[CATransaction begin];
[CATransaction setAnimationDuration:0];

[thelayer setAlpha:0];

[CATransaction commit];

【讨论】:

  • 谢谢。这工作正常。我只是想我可以以某种方式规避使用 CA 的“臃肿”。但也许我错了,因为实际上 CA 就是为此而设计的。
  • 我现在正在使用它并将其变成一个功能。动画时间现在是 init 方法的一部分,所以我可以显示并移动或淡化它们。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多