我遇到了一个奇怪的问题。我不知道是我犯了什么错误,还是UIBezierPath有问题。
我想让UIBezierPath的圆角半径大约为宽度或高度的40%,但问题是只要我增加0.1%的圆角半径,它就会变成圆形。例如,它显示圆角半径为0.327%,但只要我将其设置为0.328%,它就会变成圆形。
请让我知道我可以做些什么来解决我的问题。Current scenario with corner percentage
类对于我的看法如下。
class MyView: UIView {
var fraction : CGFloat = 0.5 {
didSet {
progressBorder.strokeEnd = fraction
}
}
var strokeWidth : CGFloat = 4.0 {
didSet {
}
}
@IBInspectable var cornerPercentage : CGFloat = 0.327
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
layer.cornerRadius = frame.height * cornerPercentage
// backgroundColor = .red
}
let progressBorder = CAShapeLayer()
override func draw(_ rect: CGRect) {
let cornerrad : CGFloat = (frame.height) * cornerPercentage
layer.borderColor = UIColor.systemPink.cgColor
layer.cornerRadius = cornerrad
let border = CAShapeLayer()
// make sure this path coincides with the border of the view
border.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerrad).cgPath
border.cornerRadius = cornerrad
border.strokeStart = 0
border.strokeEnd = 1
border.strokeColor = AppColor.fieldsBackground().cgColor
border.lineWidth = strokeWidth
border.fillColor = nil
// make sure this path coincides with the border of the view
progressBorder.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerrad).cgPath
progressBorder.cornerRadius = cornerrad
progressBorder.lineJoin = .miter
progressBorder.lineCap = .round
progressBorder.strokeStart = 0
progressBorder.strokeEnd = fraction
progressBorder.strokeColor = AppColor.buttonsPrimary().cgColor
progressBorder.lineWidth = strokeWidth
progressBorder.fillColor = nil
layer.addSublayer(border)
layer.addSublayer(progressBorder)
backgroundColor = .white
}
}
我需要一个高度或宽度为正方形视图40%的圆角进度视图
2条答案
按热度按时间5m1hhzi41#
上面的答案适用于圆角半径。但现在我希望进度是从确切的中心开始。目前它是从远离中心的一点开始。
Example
图像中的进度strokeEnd为0.5。
我想要类似this的东西
xwbd5t1u2#
如果你跟随我评论中的链接,你会看到关于
UIBezierPath(roundedRect: ...)
中“bug”的讨论。下面是
MyView
的修改版本--带有cornerPercentage = 0.4
--它避免了这个bug:以及示例视图控制器-
fraction
从0.1
开始,并且随着每次敲击增加0.1
:作为旁注:你会发现我稍微移动了一下代码。你可以添加形状层,并在init期间设置它们的不变属性,然后在
layoutSubviews()
中设置路径和其他可变属性。在draw()
中添加子层不是一个好主意。