Вопрос по iphone, calayer, uiview, objective-c, ios – Отключение анимации при изменении свойств слоя / вида?

9

Я написал анимацию, добавив несколько слоев в UIView. Эти слои должны быть видны или невидимы скриптом.

Сценарий основан на объектах, которые реализуют протокол:

<code>// the general protocol for a step
@protocol ActionStep 
-(void) applyForTime:(int)playtime;
-(void) reset;
@end
</code>

в таймере я перебираю объекты шага:

<code>NSEnumerator* enumerator = [ScriptObjects objectEnumerator];
id obj;

while ( obj = [enumerator nextObject] )
{
  id <ActionStep> step = obj;
  [step applyForTime:currentmilliseconds];
}
</code>

Один объект сценария - это объект:

<code>@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
</code>

и, наконец, я реализую протокол на уровне:

<code>-(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;
    }
  }
}
</code>

Применение изменений в шаге приводит к переходу.

Есть ли способ отключить этот переход? Я сейчас вообще не использую вызов CoreAnimation, только сами свойства (см. Код).

Я думаю, что нам нужно увидеть немного больше кода - например, как вы делаете переход? Что вы подразумеваете под "просто свойствами"? ? SomaMan
Я пытался разработать это .. Zuppa

Ваш Ответ

2   ответа
3

Просто оберните код, где вы вносите изменения.

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

[thelayer setAlpha:0];

[CATransaction commit];
Я использую это сейчас и превращаю это в функцию. Время анимации теперь является частью метода init, так что я могу показывать вещи И перемещать или исчезать. Zuppa
Благодарю. Это отлично работает. Я просто думал, что смогу как-то обойти «раздувание» использования CA. Но, возможно, я ошибаюсь, так как на самом деле CA предназначен для этого. Zuppa
36

Изменение одного из слоев "анимируемого" Свойства создают то, что в документации Apple называется неявной анимацией.

Чтобы процитировать документы Xcode на эту тему:

Core Animation’s implicit animation model assumes that all changes to animatable layer properties should be gradual and asynchronous. Dynamically animated scenes can be achieved without ever explicitly animating layers. Changing the value of an animatable layer property causes the layer to implicitly animate the change from the old value to the new value. While an animation is in-flight, setting a new target value causes the animation transition to the new target value from its current state.

Под прикрытием система генерирует CAAnimation, которая вносит изменения.

Как сказал другой автор, вы можете использовать setAnimationDuration, чтобы анимация происходила в одно мгновение, что приводит к отключению анимации. Я подозреваю, что система все еще генерирует анимацию как бы то ни было.

Официальный способ отключить неявную анимацию слоя - использовать

[CATransaction begin];
[CATransaction setDisableActions: YES];
//layer changes
[CATransaction commit];
Edit:

В Swift 3 этот код будет выглядеть так:

CATransaction.begin()
CATransaction.setDisableActions(true)
//layer changes
CATransaction.commit()
Да, это выглядит более перспективным и более точным. Я подозревал, что что-то подобное в свойствах самого объекта, мне все еще нужно привыкнуть к тому факту, что target-c и какао на самом деле не работают как-то иначе ... Zuppa

Похожие вопросы