gpt4 book ai didi

ios - 带虚线的圆圈 uiview

转载 作者:搜寻专家 更新时间:2023-10-31 22:53:10 24 4
gpt4 key购买 nike

我想用虚线画一个圆圈。我可以在矩形中制作线条,但我不知道如何在圆形中制作这些线条。这是我得到的答案,但它在 Objective-C 中:UIView Draw Circle with Dotted Line Border

这是我的代码,它用虚线制作了一个矩形。

func addDashedBorder() {
let color = UIColor.red.cgColor

let shapeLayer:CAShapeLayer = CAShapeLayer()
let frameSize = self.frame.size
let shapeRect = CGRect(x: 0, y: 0, width: frameSize.width, height: frameSize.height)

shapeLayer.bounds = shapeRect
shapeLayer.position = CGPoint(x: frameSize.width/2, y: frameSize.height/2)
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = color
shapeLayer.lineWidth = 2
shapeLayer.lineJoin = CAShapeLayerLineJoin.round
shapeLayer.lineDashPattern = [6,3]
shapeLayer.path = UIBezierPath(roundedRect: shapeRect, cornerRadius: 5).cgPath

self.layer.addSublayer(shapeLayer)
}

最佳答案

当然,您可以只使用选定的破折号图案呈现您的圆形 UIBezierPath:

class DashedCircleView: UIView {
private var shapeLayer: CAShapeLayer = {
let shapeLayer = CAShapeLayer()
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 10
shapeLayer.lineCap = .round
shapeLayer.lineDashPattern = [20, 60]
return shapeLayer
}()

override init(frame: CGRect = .zero) {
super.init(frame: frame)
configure()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}

override func layoutSubviews() {
super.layoutSubviews()
updatePath()
}
}

private extension DashedCircleView {
func configure() {
layer.addSublayer(shapeLayer)
}

func updatePath() {
let rect = bounds.insetBy(dx: shapeLayer.lineWidth / 2, dy: shapeLayer.lineWidth / 2)
let radius = min(rect.width, rect.height) / 2
let center = CGPoint(x: rect.midX, y: rect.midY)
let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: 0, endAngle: .pi * 2, clockwise: true)
shapeLayer.path = path.cgPath
}
}

产生:

enter image description here

这种方法的问题是很难让虚线图案对齐(请注意“3 点钟”位置的笨拙虚线)。您可以通过确保 lineDashPattern 的两个值加起来等于某个数字来解决这个问题,该数字均匀地分成圆的周长(例如 2π × radius):

let circumference: CGFloat = 2 * .pi * radius
let count = 30
let relativeDashLength: CGFloat = 0.25
let dashLength = circumference / CGFloat(count)
shapeLayer.lineDashPattern = [dashLength * relativeDashLength, dashLength * (1 - relativeDashLength)] as [NSNumber]

或者,您可以完全不使用 lineDashPattern,而是保持实心笔触并将 path 本身作为一系列小圆弧。这样我就可以实现所需的虚线效果,但要确保它在我们从 0 旋转到 2π 时均匀地分成 count 个小弧:

class DashedCircleView: UIView {
private var shapeLayer: CAShapeLayer = {
let shapeLayer = CAShapeLayer()
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 10
shapeLayer.lineCap = .round
return shapeLayer
}()

override init(frame: CGRect = .zero) {
super.init(frame: frame)
configure()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}

override func layoutSubviews() {
super.layoutSubviews()
updatePath()
}
}

private extension DashedCircleView {
func configure() {
layer.addSublayer(shapeLayer)
}

func updatePath() {
let rect = bounds.insetBy(dx: shapeLayer.lineWidth / 2, dy: shapeLayer.lineWidth / 2)
let radius = min(rect.width, rect.height) / 2
let center = CGPoint(x: rect.midX, y: rect.midY)

let path = UIBezierPath()
let count = 30
let relativeDashLength: CGFloat = 0.25 // a value between 0 and 1
let increment: CGFloat = .pi * 2 / CGFloat(count)

for i in 0 ..< count {
let startAngle = increment * CGFloat(i)
let endAngle = startAngle + relativeDashLength * increment
path.move(to: CGPoint(x: center.x + radius * cos(startAngle),
y: center.y + radius * sin(startAngle)))
path.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
}
shapeLayer.path = path.cgPath
}
}

产生:

enter image description here

关于ios - 带虚线的圆圈 uiview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com