我的代码用于分类。调用函数dizzy时,它将更改uiview中所有线条的颜色。我想要做的是仅更改函数调用后绘制的线条颜色。它不应像现在一样更改已经绘制的线条的颜色。
class ViewController: UIViewController {
@objc func dizzy() {
canvas.strokeColor = .gray
}
var canvas = Canvas()
}
class Canvas: UIView {
var strokeColor = UIColor.green {
didSet {
self.setNeedsDisplay()
}
}
func undo() {
_ = lines.popLast()
setNeedsDisplay()
}
func clear() {
lines.removeAll()
setNeedsDisplay()
}
var lines = [[CGPoint]]()
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
context.setStrokeColor(strokeColor.cgColor)
context.setLineWidth(5)
context.setLineCap(.butt)
lines.forEach { (line) in
for (i, p) in line.enumerated() {
if i == 0 {
context.move(to: p)
} else {
context.addLine(to: p)
}
}
}
context.strokePath()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
lines.append([CGPoint]())
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let point = touches.first?.location(in: self) else { return }
guard var lastLine = lines.popLast() else { return }
lastLine.append(point)
lines.append(lastLine)
setNeedsDisplay()
}
}
您需要创建一个struct
来用行存储颜色。在touchesBegan()
中,将当前的strokeColor
与coloredLine
一起存储。在draw(rect:)
中,为每行设置笔划前的context.setStrokeColor(line.color.cgColor)
。
我通过添加按钮来更改颜色进行了测试。您可以根据需要将其连接。
struct ColoredLine {
var color = UIColor.black
var points = [CGPoint]()
}
class ViewController: UIViewController {
@IBOutlet weak var canvas: Canvas!
@IBAction func doRed(_ sender: UIButton) {
canvas.strokeColor = .red
}
@IBAction func doGreen(_ sender: UIButton) {
canvas.strokeColor = .green
}
@IBAction func doBlue(_ sender: UIButton) {
canvas.strokeColor = .blue
}
@IBAction func doBlack(_ sender: UIButton) {
canvas.strokeColor = .black
}
}
class Canvas: UIView {
var strokeColor = UIColor.green
func undo() {
_ = lines.popLast()
setNeedsDisplay()
}
func clear() {
lines.removeAll()
setNeedsDisplay()
}
var lines = [ColoredLine]()
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
context.setLineWidth(5)
context.setLineCap(.butt)
lines.forEach { (line) in
for (i, p) in line.points.enumerated() {
if i == 0 {
context.move(to: p)
} else {
context.addLine(to: p)
}
}
context.setStrokeColor(line.color.cgColor)
context.strokePath()
context.beginPath()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
var coloredLine = ColoredLine()
coloredLine.color = strokeColor
lines.append(coloredLine)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let point = touches.first?.location(in: self) else { return }
guard var lastLine = lines.popLast() else { return }
lastLine.points.append(point)
lines.append(lastLine)
setNeedsDisplay()
}
}