【问题标题】:draw only one object by button and undo button通过按钮和撤消按钮仅绘制一个对象
【发布时间】:2025-12-18 07:30:01
【问题描述】:

我是 swift 的初学者,现在我正在与可能很简单的事情打架。

如果我点击按钮撤消,MyDrawView 应该是清晰的,如果我点击多边形填充,例如紫色,然后我点击圆形,只有一个对象。

类似这样的:

但现在我有了这个:

我的代码:

import UIKit
import QuartzCore

class MyDrawView: UIView{

    var circle = UIBezierPath()
    let polygon = UIBezierPath()

    let shapeLayer1 = CAShapeLayer()
    let shapeLayer2 = CAShapeLayer()


    func drawCircle(){
        circle = UIBezierPath(arcCenter: CGPoint(x: 200, y: 300), radius: CGFloat(100), startAngle: CGFloat(0), endAngle: CGFloat(Double.pi * 2), clockwise: true)

        shapeLayer1.path = circle.cgPath

        shapeLayer1.fillColor = UIColor.clear.cgColor
        shapeLayer1.strokeColor = UIColor.black.cgColor 
        shapeLayer1.lineWidth = 3.0 

        layer.addSublayer(shapeLayer1)
    }


    func drawPolygon(){
        polygon.move(to: CGPoint(x: 50, y: 50))
        polygon.addLine(to: CGPoint(x: 230, y: 90))
        polygon.addLine(to: CGPoint(x: 240, y: 250))
        polygon.addLine(to: CGPoint(x: 50, y: 280))
        polygon.addLine(to: CGPoint(x: 100, y: 150))
        polygon.addLine(to: CGPoint(x: 50, y: 50))

        shapeLayer4.path = polygon.cgPath

        shapeLayer2.fillColor = UIColor.clear.cgColor 
        shapeLayer2.strokeColor = UIColor.black.cgColor 
        shapeLayer2.lineWidth = 3.0 

         layer.addSublayer(shapeLayer2)
    }


    @IBAction func clickButtonUndo(_ sender: UIButton) {

    }

    @IBAction func clickButtonCircle(_ sender: UIButton) {
        drawCircle()
    }

    @IBAction func clickButtonPolygon(_ sender: UIButton) {
        drawPolygon()
    }




    @IBAction func buttonPurple(_ sender: UIButton) {
        shapeLayer1.path = circle.cgPath
        shapeLayer2.path = polygon.cgPath

        shapeLayer1.fillColor = UIColor.purple.cgColor
        shapeLayer1.strokeColor = UIColor.black.cgColor 
        shapeLayer1.lineWidth = 3.0 

        shapeLayer2.fillColor = UIColor.purple.cgColor 
        shapeLayer2.strokeColor = UIColor.black.cgColor
        shapeLayer2.lineWidth = 3.0 

        layer.addSublayer(shapeLayer1)
        layer.addSublayer(shapeLayer2)

    }

}

【问题讨论】:

    标签: ios swift xcode calayer cashapelayer


    【解决方案1】:

    你可以用真/假来做一个算法 例如:

    var circleBool = true
    

    var polygonBool = true

    @IBAction func clickButtonCircle(_ sender: UIButton) {
      if circleBool == true {
        drawCircle()
      polygonBool = false
    

    } }

    @IBAction func clickButtonPolygon(_ sender: UIButton) {
       if polygonBool == true {
        drawPolygon()
       circleBool = false
    
    }
    
    @IBAction func clickButtonUndo(_ sender: UIButton) {
    circleBool = true
    polygonBool = true
    
    }
    

    (对于撤消按钮idk如何清除但尝试绘制x:0和y:0)

    【讨论】:

      【解决方案2】:

      你自己加了两层

      layer.addSublayer(shapeLayer1)
      layer.addSublayer(shapeLayer2)
      

      如果你只想拥有一个形状 .... 只使用一个 shapeLayer ... 在每个按钮点击上为其分配形状 ... 并致电 setNeedsLayout() .. 不要为多个形状使用多个 shapeLayers

      你可以有一个枚举

      public enum ShapeType {
               case circle
               case square
               case star
               case Polygon
           }
      

      然后在你的 View 类中

      public var shape: ShapeType {
              get {
                  return _shape
              }
              set(newValue) {
                  _shape = newValue
                  setNeedsDisplay()
              }
          }
      

      你可以有默认的形状

          private let ilayer = CAShapeLayer()
          private var _shape: ShapeType = .circle
      

      然后你可以写一个函数

      // MARK: - Base shape BezierPath
      
      private func getBaseShape(frame:CGRect) -> UIBezierPath? {
      
          switch _shape {
          case .circle:
              return UIBezierPath(ovalIn: group)
          case .square:
              return  UIBezierPath(roundedRect: group, cornerRadius: 8)
          case .star:
              return drawStarShape()
          case .polygon:
              return drawpolygonPath()
      
          }
      }
      

      并将其分配给形状

      let getShapePath = getBaseShape(group: group)
      

      【讨论】: