gpt4 book ai didi

ios - 画(_直角: CGRect) not getting called in custom view

转载 作者:搜寻专家 更新时间:2023-11-01 07:04:43 27 4
gpt4 key购买 nike

我正在尝试通过扩展类 UIView 来创建自定义 View ,该类可以在自定义 View 的中心显示一个圆圈。为了添加自定义绘图,我重写了 draw(_ rect: CGRect) 方法,如下所示。

    public override func draw(_ rect: CGRect) {
super.draw(rect)
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = bounds.width <= bounds.height ? bounds.width : bounds.height
let circlePath = UIBezierPath (arcCenter: center, radius: CGFloat(minLength / 2), startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians) , clockwise: true)

let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor
layer.addSublayer(shapeLayer)
}

但是当我尝试在 Storyboard 中添加相同的自定义组件并在 draw 方法中添加断点时,它没有被调用。出于好奇,我在被调用的 init?(coder aDecoder: NSCoder) 方法中添加了一个断点。此外,当我尝试如下重写该方法时,它工作正常。

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

fileprivate func drawCircle() {
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = bounds.width <= bounds.height ? bounds.width : bounds.height
let circlePath = UIBezierPath (arcCenter: center, radius: CGFloat(minLength / 2), startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians) , clockwise: true)

let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor

layer.addSublayer(shapeLayer)
}

方法的问题是我有一个自定义属性 circleColor

@IBInspectable
public var circleColor : UIColor = UIColor.gray

在调用init方法时还没有设置,它总是画一个灰色的圆圈。

请帮助让我知道未调用 draw 方法的原因。

提前致谢

最佳答案

我不确定你的根本错误在哪里,但你不应该为了添加一个层而覆盖 draw(:)。这意味着每次组件重新渲染时都会再次添加一个新层。这不是你想要的。

您还应该确保在更改颜色属性时更新图层颜色。为此,只需保存对图层的引用:

private let shapeLayer = CAShapeLayer()

@IBInspectable
public var circleColor : UIColor = UIColor.gray {
didSet {
shapeLayer.fillColor = circleColor.cgColor
}
}

public override init(frame: CGRect = .zero) {
super.init(frame: frame)
updateLayer()
layer.addSublayer(shapeLayer)
}

required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateLayer()
layer.addSublayer(shapeLayer)
}

fileprivate func updateLayer() {
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = min(bounds.width, bounds.height)
let circlePath = UIBezierPath(arcCenter: center, radius: minLength / 2, startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians), clockwise: true)

shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor
}

override func layoutSubviews() {
super.layoutSubviews()
// update layer position
updateLayer()
}

如果你真的想覆盖draw(rect:),你根本不需要创建层或覆盖初始值设定项:

@IBInspectable
public var circleColor : UIColor = UIColor.gray {
didSet {
setNeedsDisplay()
}
}

public override func draw(_ rect: CGRect) {
// no need to call super.draw(rect)

let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = min(bounds.width, bounds.height)
let circlePath = UIBezierPath(arcCenter: center, radius: minLength / 2, startAngle: 0, endAngle: .pi * 2, clockwise: true)

// the following methods use current CGContext
circleColor.set()
circlePath.fill()
}

关于ios - 画(_直角: CGRect) not getting called in custom view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725671/

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