Swift: Position and Resize自定义循环进度视图UIBezierPath
Swift: Position and Resize custom circular progress view UIBezierPath
我正在尝试制作自定义进度视图。我读过这个教程:https://medium.com/@imsree/custom-circular-progress-bar-in-ios-using-swift-4-b1a9f7c55da and watched this video: https://youtu.be/Qh1Sxict3io
这两个教程都非常有帮助,使进度视图的创建变得非常简单直接。
但是我的问题是,对于不同的设备,大小和位置不是动态的。
我尝试将进度视图作为子视图添加到 UIView(具有动态约束),因为以编程方式直接向进度视图添加约束会导致崩溃。 UIView 正在按预期调整大小,但它的子视图(进度视图)没有。
我不确定如何更改它的 x、y 和半径:
let circularPath = UIBezierPath(arcCenter: CGPoint (x: frame.midX, y: frame.size.height/2 ), radius: (frame.size.width-1.5)/2, startAngle: -.pi/2, endAngle: 3 * .pi/2, clockwise: true)
因为它在不同的 .swift 文件中。到目前为止,仅更改这 3 个值会导致路径发生一些移动。
任何帮助将不胜感激!
谢谢!
由于您的图层基于路径,因此您需要在视图调整大小时更新它。
我使用了与您提到的教程完全相同的代码,并将以下内容添加到 CircularProgressView
:
var bezierPath: UIBezierPath {
UIBezierPath(arcCenter: CGPoint(x: frame.size.width / 2.0, y: frame.size.height / 2.0), radius: (frame.size.width - 20) / 2, startAngle: -.pi / 2, endAngle: 3 * .pi / 2, clockwise: true)
}
override func layoutSubviews() {
super.layoutSubviews()
let circularPath = bezierPath
circleLayer.path = circularPath.cgPath
progressLayer.path = circularPath.cgPath
}
我正在尝试制作自定义进度视图。我读过这个教程:https://medium.com/@imsree/custom-circular-progress-bar-in-ios-using-swift-4-b1a9f7c55da and watched this video: https://youtu.be/Qh1Sxict3io
这两个教程都非常有帮助,使进度视图的创建变得非常简单直接。 但是我的问题是,对于不同的设备,大小和位置不是动态的。
我尝试将进度视图作为子视图添加到 UIView(具有动态约束),因为以编程方式直接向进度视图添加约束会导致崩溃。 UIView 正在按预期调整大小,但它的子视图(进度视图)没有。
我不确定如何更改它的 x、y 和半径:
let circularPath = UIBezierPath(arcCenter: CGPoint (x: frame.midX, y: frame.size.height/2 ), radius: (frame.size.width-1.5)/2, startAngle: -.pi/2, endAngle: 3 * .pi/2, clockwise: true)
因为它在不同的 .swift 文件中。到目前为止,仅更改这 3 个值会导致路径发生一些移动。
任何帮助将不胜感激!
谢谢!
由于您的图层基于路径,因此您需要在视图调整大小时更新它。
我使用了与您提到的教程完全相同的代码,并将以下内容添加到 CircularProgressView
:
var bezierPath: UIBezierPath {
UIBezierPath(arcCenter: CGPoint(x: frame.size.width / 2.0, y: frame.size.height / 2.0), radius: (frame.size.width - 20) / 2, startAngle: -.pi / 2, endAngle: 3 * .pi / 2, clockwise: true)
}
override func layoutSubviews() {
super.layoutSubviews()
let circularPath = bezierPath
circleLayer.path = circularPath.cgPath
progressLayer.path = circularPath.cgPath
}