Ios UIBezierPath绘制的三角形视图的颜色不变

Ios UIBezierPath绘制的三角形视图的颜色不变,ios,swift,xcode,Ios,Swift,Xcode,我想画一个三角形视图,并通过编程更改填充颜色 下面是我的代码 导入UIKit 类ViewController:UIViewController{ 设triangleView=triangleView() 重写func viewDidLoad(){ super.viewDidLoad() //加载视图后执行任何其他设置。 triangleView.frame=CGRect(x:0, y:100, 宽度:50, 身高:50) self.view.addSubview(三角形视图) } 覆盖函数视图显

我想画一个三角形视图,并通过编程更改填充颜色

下面是我的代码

导入UIKit
类ViewController:UIViewController{
设triangleView=triangleView()
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
triangleView.frame=CGRect(x:0,
y:100,
宽度:50,
身高:50)
self.view.addSubview(三角形视图)
}
覆盖函数视图显示(u动画:Bool){
super.viewdide显示(动画)
triangleView.drawColor(颜色:。黄色)
}
}
类TriangleView:UIView{
let path=UIBezierPath()
重写函数绘图(rect:CGRect){
打印(“三角视图绘制”)
移动路径(到:CGPoint(x:0,y:self.bounds.height/2))
addLine(to:CGPoint(x:self.bounds.maxX,y:0))
addLine(到:CGPoint(x:self.bounds.maxX,y:self.bounds.maxY))
path.addLine(to:CGPoint(x:0,y:self.bounds.height/2))
path.close()
self.drawColor(颜色:。绿色)
self.backgroundColor=.clear
}
func drawColor(颜色:UIColor){
打印(“TriangleView drawColor”)
color.setFill()
path.lineWidth=0
path.fill()
path.stroke()
}
}
在此代码中,
TriangleView
绘制一个填充绿色的三角形

之后,
ViewController
将填充颜色更改为黄色

跟踪结果

有两个问题

  • 背景色为黑色,但预期为
    清晰

  • 三角形颜色未更改为
    黄色


  • 有人能给我一些建议吗?

    使用
    UIGraphicsGetCurrentContext

    class TriangleView: UIView {
        
        private var triangleColor: UIColor = .green {
            didSet {
                self.setNeedsDisplay()
            }
        }
        
        override func draw(_ rect: CGRect) {
            print("TriangleView draw")
            self.backgroundColor = .white // Set any background color
            
            guard let context = UIGraphicsGetCurrentContext() else { return }
            
            context.saveGState()
            defer { context.restoreGState() }
            
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0, y: self.bounds.height / 2))
            path.addLine(to: CGPoint(x: self.bounds.maxX, y: 0))
            path.addLine(to: CGPoint(x: self.bounds.maxX, y: self.bounds.maxY))
            path.addLine(to: CGPoint(x: 0, y: self.bounds.height / 2))
            path.close()
            
            context.addPath(path.cgPath)
            context.setFillColor(triangleColor.cgColor)
            context.closePath()
            context.closePath()
            context.fillPath()
            context.restoreGState()
        }
        
        func drawColor(color: UIColor) {
            triangleColor = color
        }
    }
    
    或者您可以使用
    CAShapeLayer

    class TriangleView: UIView {
        
        private let shapeLayer = CAShapeLayer()
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            self.initialConfig()
        }
        
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            self.initialConfig()
        }
        
        override func draw(_ rect: CGRect) {
            print("TriangleView draw")
            self.shapeLayer.frame = self.bounds
            drawShape()
        }
        
        private func initialConfig() {
            self.backgroundColor = .white
            self.shapeLayer.fillColor = UIColor.green.cgColor
            self.layer.addSublayer(shapeLayer)
        }
        
        private func drawShape() {
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0, y: self.bounds.height / 2))
            path.addLine(to: CGPoint(x: self.bounds.maxX, y: 0))
            path.addLine(to: CGPoint(x: self.bounds.maxX, y: self.bounds.maxY))
            path.addLine(to: CGPoint(x: 0, y: self.bounds.height / 2))
            path.close()
            
            shapeLayer.path = path.cgPath
        }
        
        func drawColor(color: UIColor) {
            self.shapeLayer.fillColor = color.cgColor
        }
    }
    

    谢谢大家!<代码>UIGraphicsGetCurrentContext对我不起作用。当
    ViewController
    不调用
    drawColor
    时,背景色仍为黑色。但是,
    CAShapeLayer
    工作正常!我用它代替我的。非常感谢。