同时动画UIView的frame和圆角半径

7
我正在尝试使用UIView创建一个可缩放/扩展的圆形。我使用UIView.animateWithDuration...(等等)来设置视图的框架,并使用CABasicAnimation来动画显示视图(层)的圆角。两者都按照正确的时间进行动画,并在正确的圆形值(圆角=1/2宽度)处结束。问题是,在动画期间,CABasicAnimation和UIView.animateWithDuration似乎具有不同的动画曲线。如何实现正确的圆形大小动画?
如果答案是使用CABAsicAnimation进行农场肿胀,请解释如何做到这一点。
谢谢! 代码:
此代码位于UIView的扩展中。
//This is how it's being used to shrink the circle:

circleview.growByPixles(-10, seconds: 0.3, completion: {})
circleview.setCornerRadius(radius:(circleview.bounds.size.width - 10) / 2 seconds: 0.3)

//////

func morphToFrame(frame: CGRect, seconds: Double, completion: () -> ()) {
    UIView.animateWithDuration(seconds,
        animations: {
            self.frame = frame
        },
        completion: { _ in
            completion()
        })
}

//negative integers shrink
func growByPixels(pixels: CGFloat, seconds: Double, completion: () -> ()) {
    var f:CGRect = self.frame

    var newFrame:CGRect = CGRect(x: f.origin.x - pixels/2, y: f.origin.y - pixels/2,  width: f.size.width + pixels, height: f.size.height + pixels)

    self.morphToFrame(newFrame, seconds: seconds, completion: completion)
}

func setCornerRadius(radius: CGFloat, seconds: Double) {

    self.layer.masksToBounds = true

    var animation = CABasicAnimation(keyPath: "cornerRadius")
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.fromValue = NSNumber(float: Float(self.layer.cornerRadius))
    self.layer.cornerRadius = radius
    animation.duration = seconds
    self.layer.addAnimation(animation, forKey: "cornerRadius")
}

我添加了代码,这是使用的三个函数。 - zrubenst
你需要将它转换为Swift。http://stackoverflow.com/questions/26521554/creating-an-expanding-circle-ios/26521755#26521755 - SomeGuy
1个回答

6
我这样调整我的圆形视图大小:

我这样调整我的圆形视图大小:

- (void)resizeCircleView:(CGRect)frame {

    CGRect estimateFrame = frame;
    float duration = 1.0f;

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        [circle setFrame:estimateFrame];
    } completion:nil];

    CGFloat estimateCorner = estimateFrame.size.width / 2;
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"cornerRadius"];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.fromValue = @(circle.layer.cornerRadius);
    animation.toValue = @(estimateCorner);
    animation.duration = duration;
    [circle.layer setCornerRadius:estimateCorner];
    [circle.layer addAnimation:animation forKey:@"cornerRadius"];
}

1
动画就是不能同时工作。 - Salmo
是的,这些方法不会同步两个动画。 - Juan Fran Jimenez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接