нарисовать только один объект кнопкой и отменить кнопку - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в стремительном, и теперь я немного борюсь с, может быть, простой вещью.

Если я нажимаю кнопку «Отменить», MyDrawView должен быть очищен, и если я нажимаю на полигоне заливку, например, фиолетового цвета, а затем нажимаю на круг, чтобы получить только один объект.

примерно так:

only 1 object

но теперь у меня есть это:

but now i have this

мой код:

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)

    }

}

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете создать алгоритм с true / false, например:

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)

1 голос
/ 01 мая 2020

Вы добавляете два слоя самостоятельно

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

, если хотите иметь только одну фигуру .... используйте только один shapeLayer ... Присвойте ему форму на каждое нажатие кнопки ... и Вызовите setNeedsLayout() .. не используйте несколько shapeLayers для нескольких фигур

Вы можете иметь Enum

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)
...