我有这个项目。
我的目标是使圆在动画的每个特定时刻都保持圆的形状,而不是使角半径大于当前圆的高度。
处理循环增长的代码如下:

func turnOn() {
    let tempView = UIView(frame: CGRect(x: ballDiameter / 2, y: ballDiameter / 2, width: 0, height: 0))
    tempView.backgroundColor = onColor
    tempView.layer.cornerRadius = ballDiameter / 2
    self.addSubview(tempView)

    UIView.animate(withDuration: dotTravelTime, animations: { [weak self] in

        //RIGHT HERE is the code for the circle to hold it's circular form
        if self != nil {
            tempView.frame = CGRect(x: 0, y: 0, width: self!.ballDiameter, height: self!.ballDiameter)
            tempView.layer.cornerRadius = self!.ballDiameter / 2
        }
        self?.layoutIfNeeded()

    }) { [weak self] _ in
        self?.backgroundColor = self!.onColor
        tempView.removeFromSuperview()
    }
}

func turnOff() {
    let tempView = UIView(frame: CGRect(x: 0, y: 0, width: ballDiameter, height: ballDiameter))
    tempView.backgroundColor = onColor
    self.addSubview(tempView)
    self.backgroundColor = offColor

    UIView.animate(withDuration: dotTravelTime, animations: { [weak self] in

        //RIGHT HERE is the code for the circle to hold it's circular form
        if self != nil {
            tempView.frame = CGRect(x: self!.ballDiameter / 2, y: self!.ballDiameter / 2, width: 0, height: 0)
            tempView.layer.cornerRadius = self!.ballDiameter / 2
        }
        self?.layoutIfNeeded()

    }) { _ in
        tempView.removeFromSuperview()
    }
}

这里是我处理圆形动画的地方。我使用一个temp UIView来处理动画,然后在更改后面实际视图的颜色后删除该视图。tempView是一个圆形开关,您可以看到它随着滑动动画的变化而变化。如果你需要我的设计信息,请告诉我。我试了很多方法,结果都解决了,因为圆是正方形,或者角半径比我想要的稍大。(我认为它正在缩小拐角半径,比原来的尺寸小一些,但它很小。

最佳答案

我的目标是使圆扩大而减少保持圆的形状
那就不要用“愚蠢”的方式做一个圆(cornerRadius)。遮罩到圆形路径并设置遮罩(和/或路径)的生长/收缩动画。
在本例中,我将黄色视图及其遮罩一起增长。动画是故意慢(2秒的持续时间)向您显示,这是顺利的工作。黄色视图在左上角包含一个标签,在右下角包含一个标签,这样您就可以看到(1)它是一个视图,(2)它连贯地增长。
swift - 如何使UIView在UIView.animate()中以正确的拐角半径增长?-LMLPHP

关于swift - 如何使UIView在UIView.animate()中以正确的拐角半径增长?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41523638/

10-12 14:56