平滑旋转并用阴影改变UIView的大小

时间:2012-04-20 02:38:18

标签: ios uiview core-animation calayer shadow

我有一个带有阴影的UIView和一个UIImageView子视图。

我希望在iPad旋转时调整视图大小,我想在willRotateToInterfaceOrientation回调中执行此操作。

如果我以基本方式在UIView上设置阴影,则旋转非常不稳定;所以我希望其他人提供一些关于如何设置阴影设置layer.shadowPath。

的建议

我尝试使用[UIView animateWithDuration:animations]设置动画帧大小更改并在同一个块中设置新的shadowPath,但阴影路径会捕捉到新的大小。

如果我不在动画块中更改图层的shadowPath,它就不会改变。

从我完成的一些搜索中,需要使用CABasicAnimation动画更改图层属性。

所以我认为问题可能是“如何同时为UIView的帧大小和图层变化设置动画?”

1 个答案:

答案 0 :(得分:8)

有一些代码比人们希望的要多一些,但这样的事情应该有效。

  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;