使用UIBezierPath和iOS draw rect填充圆动画
我在github上有这个: 它执行以下操作: 动画中有一个小故障,当圆填充并且视图正在调整大小时,我不想修复它 出现小故障是因为我通过设置层角来填充圆,所以它看起来像一个圆,我随着动画进度增加线宽,看起来像是从外到内填充。从epcdrawniconspiner.swift文件:使用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),
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
属性。可以在设置视图大小的动画时设置此遮罩大小的动画。其次,稍后需要创建一个附加形状(可能类似于旋转圆),并在此层上执行线宽动画。遮罩将确保线不会向外生长,而只能向内生长
希望这能有所帮助。我最终得到了以下解决方案:
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,我将在这里检查并更新;)