Плавно вращать и изменять размер UIView с тенью

У меня есть UIView с тенью и подвью UIImageView.

Я хочу изменить размер представления, когда iPad повернут, и я пытаюсь сделать это в обратном вызове willRotateToInterfaceOrientation.

Если я устанавливаю тень на UIView основным способом, то вращение очень прерывистое; поэтому мне бы хотелось, чтобы некоторые предложения от других о том, как установить настройку shadow layer.shadowPath.

Я попытался оживить изменение размера кадра с помощью [UIView animateWithDuration:animations] и установить новый shadowPath в том же блоке, но теневой путь привязывается к новому размеру.

И если я не изменю слой shadowPath слоя в блоке анимации, он не изменится.

Из нескольких выполненных мной поисков, анимация изменений свойств слоя должна выполняться с помощью CABasicAnimation.

Итак, я думаю, что вопрос может быть "как мне одновременно изменить размер и размер кадра UIView?"

Ответ 1

Там немного больше кода, чем можно было бы надеяться, но что-то вроде этого должно работать.

  CGFloat animationDuration = 5.0;

  // Create the CABasicAnimation for the shadow
  CABasicAnimation *shadowAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
  shadowAnimation.duration = animationDuration;
  shadowAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; // Match the easing of the UIView block animation
  shadowAnimation.fromValue = (id)self.shadowedView.layer.shadowPath;

  // Animate the frame change on the view
  [UIView animateWithDuration:animationDuration
                        delay:0.0f
                      options:UIViewAnimationCurveEaseInOut
                   animations:^{
                     self.shadowedView.frame = CGRectMake(self.shadowedView.frame.origin.x,
                                                          self.shadowedView.frame.origin.y,
                                                          self.shadowedView.frame.size.width * 2.,
                                                          self.shadowedView.frame.size.height * 2);
                   } completion:nil];

  // Set the toValue for the animation to the new frame of the view
  shadowAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:self.shadowedView.bounds].CGPath;

  // Add the shadow path animation
  [self.shadowedView.layer addAnimation:shadowAnimation forKey:@"shadowPath"];

  // Set the new shadow path
  self.shadowedView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.shadowedView.bounds].CGPath;