使用UIBezierPath和iOS draw rect填充圆动画

使用UIBezierPath和iOS draw rect填充圆动画,ios,swift,animation,spinner,uibezierpath,Ios,Swift,Animation,Spinner,Uibezierpath,我在github上有这个: 它执行以下操作: 动画中有一个小故障,当圆填充并且视图正在调整大小时,我不想修复它 出现小故障是因为我通过设置层角来填充圆,所以它看起来像一个圆,我随着动画进度增加线宽,看起来像是从外到内填充。从epcdrawniconspiner.swift文件: let ovalPath = UIBezierPath() ovalPath.addArc(withCenter: CGPoint(x: ovalRect.midX, y: ovalRect.midY),

我在github上有这个:

它执行以下操作:

动画中有一个小故障,当圆填充并且视图正在调整大小时,我不想修复它

出现小故障是因为我通过设置层角来填充圆,所以它看起来像一个圆,我随着动画进度增加线宽,看起来像是从外到内填充。从epcdrawniconspiner.swift文件:

let ovalPath = UIBezierPath()
ovalPath.addArc(withCenter: CGPoint(x: ovalRect.midX, y: ovalRect.midY),
                radius: ovalRect.width / 2,
                startAngle: start * CGFloat.pi/180,
                endAngle: end * CGFloat.pi/180, clockwise: true)
layer.cornerRadius = rect.size.height/2
ovalPath.lineWidth = 14 + ((frame.size.width) * progress)

有没有更好的方法,我可以实现这个动画而不做层半径的事情?如果我能画出这个

我可以想出两种方法来摆脱使用
corneradius

  • 使用遮罩圆角,并使用形状层填充
  • 您可以创建一个填充圆的
    CAShapeLayer
    ,并将一个框架设置为视图的边界,然后将其指定给图层的
    mask
    属性。可以在设置视图大小的动画时设置此遮罩大小的动画。其次,稍后需要创建一个附加形状(可能类似于旋转圆),并在此层上执行线宽动画。遮罩将确保线不会向外生长,而只能向内生长

  • 设置填充形状的线宽和半径的动画
  • 您将需要创建一个类似于第一个选项中描述的圆形层,但不仅需要设置线宽动画,还需要设置半径动画。例如:假设您的视图大小为40x40。当然,在填充动画开始时,形状层也需要为40x40。然后将线条宽度设置为20pts,并将圆半径设置为20pts到10pts。半径为10分、线宽为20分的圆将显示为半径为20分的填充圆


    希望这能有所帮助。

    我最终得到了以下解决方案:

    fileprivate func drawPathCompleted(_ ovalRect: CGRect) {
    
         var size: CGFloat = ovalRect.size.width
    
         var current = size*(1-progress)
    
         var pos: CGFloat = lineWidth/2
    
         while size > current {
           let ovalPath = UIBezierPath(ovalIn: CGRect(x: pos, y: pos, width: size, height: size))
           ovalPath.lineCapStyle = .round
           ovalPath.lineWidth = lineWidth
           ovalPath.stroke()
           let decr = lineWidth/2
           size -= decr
           pos += decr/2
         }
    }
    
    在此提交时,第243行:

    像这样的视图竟然需要调整大小,这似乎很奇怪?它真的需要在填充时设置大小变化的动画吗?这样的视图肯定会出现在屏幕上,然后留在那里?也许方向的改变会改变大小,但我不想让它变成动画。只需在没有动画的情况下更改大小。我实际上是在键盘出现时调整微调器的大小,所以是的,我需要调整大小。但是我有一个问题,我不能设置拐角半径变化的动画,所以我想我应该正确地绘制它,但我知道如何。我确实尝试过使用遮罩,但我有以下问题:•调整动画大小是用UIView完成的。beginAnimation…•遮罩不能与它的superview一起调整大小,您必须始终手动重新创建或更改其帧,而我无法使用UIView.beginAnimation实现这一点,因为我没有此动画的逐帧控制。对于第二种方法,idk如何做到这一点,我发现的几个例子像时钟一样填满了圆圈,我找不到一个外部的indalton指出要尝试CADisplayLink,我将在这里检查并更新;)