Я хочу анимировать фоновый слой по умолчанию 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. Но зачем это нужно?
Я не понимаю, почему фоновый слой по умолчанию не должен этого делать. Чего здесь не хватает?