Анимировать изменение границы CALayer

Я устанавливаю ширину и цвет UIView подкласса UIView следующим образом:

 - (void) setViewBorder { self.layer.borderColor = [UIColor greenColor].CGColor; self.layer.borderWidth = 3.0f; } 

Мой вопрос: как я могу оживить это? Благодарю.

Оба borderColor и borderWidth являются анимированными свойствами, но поскольку вы делаете это в подклассе вида вне блока анимации UIView, неявные анимации (те, которые происходят автоматически при изменении значения) отключены.

Если вы хотите оживить эти свойства, вы можете сделать явную анимацию с помощью CABasicAnimation . Поскольку вы анималируете два свойства на одном уровне, вы можете добавить их как в группу анимации, так и только один раз настроить продолжительность, время и т. Д. Обратите внимание, что явные анимации являются чисто визуальными, значение модели (фактическое свойство) не изменяется при их добавлении. Вот почему вы оба настраиваете анимацию и устанавливаете значение модели.

 CABasicAnimation *color = [CABasicAnimation animationWithKeyPath:@"borderColor"]; // animate from red to blue border ... color.fromValue = (id)[UIColor redColor].CGColor; color.toValue = (id)[UIColor blueColor].CGColor; // ... and change the model value self.layer.borderColor = [UIColor blueColor].CGColor; CABasicAnimation *width = [CABasicAnimation animationWithKeyPath:@"borderWidth"]; // animate from 2pt to 4pt wide border ... width.fromValue = @2; width.toValue = @4; // ... and change the model value self.layer.borderWidth = 4; CAAnimationGroup *both = [CAAnimationGroup animation]; // animate both as a group with the duration of 0.5 seconds both.duration = 0.5; both.animations = @[color, width]; // optionally add other configuration (that applies to both animations) both.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [self.layer addAnimation:both forKey:@"color and width"]; 

Если вы посмотрите на документацию для CABasicAnimation в разделе «Установка значений интерполяции», вы увидите, что нет необходимости указывать как toValue, так и fromValue, как я, поэтому код можно сделать немного короче. Тем не менее, для ясности и удобочитаемости (особенно, когда вы начинаете с Core Animation), более явные могут помочь вам (и вашему коллеге) понять код.

Вот быстрое решение для ответа @David:

 let colorAnimation = CABasicAnimation(keyPath: "borderColor") colorAnimation.fromValue = UIColor.red.cgColor colorAnimation.toValue = UIColor.blue.cgColor view.layer.borderColor = UIColor.blue.cgColor let widthAnimation = CABasicAnimation(keyPath: "borderWidth") widthAnimation.fromValue = 2 widthAnimation.toValue = 4 widthAnimation.duration = 4 view.layer.borderWidth = 4 let bothAnimations = CAAnimationGroup() bothAnimations.duration = 0.5 bothAnimations.animations = [colorAnimation, widthAnimation] bothAnimations.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) view.layer.add(bothAnimations, forKey: "color and width") 

Вы можете создать анимацию ключевого кадра, добавив ее в свой вид.

 //Create animation CAKeyframeAnimation *colorsAnimation = [CAKeyframeAnimation animationWithKeyPath:@"borderColor"]; colorsAnimation.values = [NSArray arrayWithObjects: (id)[UIColor greenColor].CGColor, (id)[UIColor yellowColor].CGColor, nil]; colorsAnimation.keyTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.25],[NSNumber numberWithFloat:1.0], nil]; colorsAnimation.calculationMode = kCAAnimationLinear; colorsAnimation.removedOnCompletion = NO; colorsAnimation.fillMode = kCAFillModeForwards; colorsAnimation.duration = 3.0f; //Create animation CAKeyframeAnimation *sizeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"borderWidth"]; sizeAnimation.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:5.0], nil]; sizeAnimation.keyTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],[NSNumber numberWithFloat:3.0], nil]; sizeAnimation.calculationMode = kCAAnimationLinear; sizeAnimation.removedOnCompletion = NO; sizeAnimation.fillMode = kCAFillModeForwards; sizeAnimation.duration = 3.0f; //Add animation [yoursubview.layer addAnimation:colorsAnimation forKey:nil]; [yoursubview.layer addAnimation:sizeAnimation forKey:nil]; 
  • SpringWithDamping для анимаций CALayer?
  • Когда подходящее время для анимации и добавления подслоев в подкласс UIView
  • Как замаскировать и добавить тень в UIView
  • UIView с пунктирной линией
  • Как изменить цвет CALayer во время анимации?
  • Создайте UIImage, создав UIWebView на фоновом потоке - iPhone
  • Маска слоя UIView анимирует рамку настройки
  • iOS CALayer и TapGestureRecognizer
  • CALayer autoresizingMask не для SDK для iOS?
  • Как замаскировать слой представления содержимым другого представления?
  • Как определить, полностью ли покрыт CALayer другими CALayers?
  • Давайте будем гением компьютера.