Почему я не могу анимировать настраиваемое свойство на фоновом слое UIView по умолчанию? - PullRequest
0 голосов
/ 17 июня 2020

Я хочу анимировать фоновый слой по умолчанию UIView. В viewDidLoad я добавляю свое настраиваемое свойство для анимации в представление с помощью:

self.layer.delegate = self;
[self.layer setValue:0 forKey:@"value"];

, как описано здесь .

Метод установки значения для изменение выглядит так и обновляет добавленное настраиваемое свойство на фоновом слое:

- (void)setValue:(NSInteger)value
{
  _value = value;
  [self.layer setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
  [self setNeedsDisplay];
}

И в actionForLayer:forKey:, перезаписанном на мой взгляд, я возвращаю анимацию, как описано здесь , который должен анимироваться от текущего значения до нового установленного значения следующим образом:

- (id<CAAction>)actionForLayer:(CALayer*)layer forKey:(NSString*)key
{
  if([key isEqualToString:@"value"])
  {
    CAAnimation* action = (CAAnimation*)[self actionForLayer:layer forKey:@"backgroundColor"];

    if(action != (CAAnimation*)[NSNull null])
    {

      CABasicAnimation* animation = [CABasicAnimation animation];
      animation.keyPath           = @"value";
      animation.fromValue         = [self.layer valueForKey:@"value"];
      animation.toValue           = [NSNumber numberWithInteger:_value];
      animation.beginTime         = action.beginTime;
      animation.duration          = action.duration;
      animation.speed             = action.speed;
      animation.timeOffset        = action.timeOffset;
      animation.repeatCount       = action.repeatCount;
      animation.repeatDuration    = action.repeatDuration;
      animation.autoreverses      = action.autoreverses;
      animation.fillMode          = action.fillMode;
      animation.timingFunction    = action.timingFunction;
      animation.delegate          = action.delegate;

      [self.layer addAnimation:animation forKey:@"value"];
    }
  }

  return [super actionForLayer:layer forKey:key];
}

И я рисую содержимое своего представления следующим образом:

- (void)drawRect:(CGRect)rect
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextClearRect(context, rect);
  [self drawARainbowUnicorn:context];;
}

Из моего контроллера представления я делаю блок анимация вроде этого:

[UIView animateWithDuration:10.0 animations:
^{
  self->_myView.value = self->_myView.maximumValue;
}];

Я вижу, что значение всегда отображается как анимированное в конечной позиции. Я ожидал, что значение будет анимировано для этой позиции в заданное время.

Все найденные мной примеры добавляют отдельный слой для анимации, например this
или this или this , и я знаю об этом StackOverflow вопрос и некоторых других, которые я нашел.

Я также посмотрел на этот более старый пример проекта от Apple. Они также создают подкласс CALayer. Но зачем это нужно?

Я не понимаю, почему фоновый слой по умолчанию не должен этого делать. Чего здесь не хватает?

...