2015-11-12 2 views
2

У меня есть UIImageView, что, когда пользователь нажимает на нее, нажимает и выключает границу в 4 пункта. Я пытаюсь оживить границу и следующим образом:Как правильно установить модель при выполнении CABeginAnimation

CABasicAnimation *widthAnimation = [CABasicAnimation animationWithKeyPath:@"borderWidth"]; 
widthAnimation.toValue = self.isSelected ? @4.0 : @0.0; 
widthAnimation.duration = 0.1; 
[self.imageView.layer addAnimation:widthAnimation forKey:@"borderWidth"]; 

Теперь, как я узнал от исследований и чистящими SO, CABasicAnimation только изменяет уровень представления, но не конкретной модели. Я также читал, что использование fillMode и removedOnCompletion - это плохая практика, поскольку это приводит к несоответствиям между моделью и тем, что видит пользователь. Итак, я попытался изменить модель с помощью следующей строки:

self.imageView.layer.borderWidth = self.isSelected ? 4.0 : 0.0; 

Проблема заключается в том, эта линия, кажется, установить свойство сразу, так что к тому времени, когда анимация бьёт, ширина границы уже в это желаемое значение. Я пробовал придерживаться этой строки в начале кода, конца и везде между ними, но без успеха. Мне удалось найти хакерское решение: вместо установки свойства я передал свойство setter в performSelector: withObject: afterDelay:, причем время задержки - это продолжительность анимации. Это работает большую часть времени, но иногда циклы не совсем совпадают, и анимация запускается сначала, затем она возвращается к исходному состоянию, затем она привязывается к новому состоянию, предположительно в результате performSelector

Итак, есть ли способ плавно анимировать границу без performSelector?

Любая помощь очень ценится.

ответ

0

Вот пример CABasicAnimation я сделал некоторое время назад:

-(void) animateProgressFrom:(CGFloat)fromValue to:(CGFloat)toValue 
{ 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    animation.fromValue = @(fromValue); 
    animation.toValue = @(toValue); 
    animation.duration = ABS(toValue - fromValue)*3.0; 
    [self.layer addAnimation:animation forKey:@"opacity"]; 

    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    self.layer.opacity = toValue; 
    [CATransaction commit]; 
} 

Я думаю, что вам нужно, это CATransaction в конце слоя анимации.