在 uiview 的子类中从 CGPoint 线更改颜色
change color from CGPoint line in a subclass of uiview
当 class View Controller 中的 func dizzy 被调用时,我的代码试图将线条的颜色从红色更改为蓝色。问题是我不知道如何从 class 视图控制器做到这一点。我可以在 class Canvas 中完成,但我需要从 func dizzy 中控制它,因为它在 class viewController.I 中用作按钮不在乎我是否必须创建canvas func 中的一个 func,然后从 viewController 中调用它。
class ViewController: UIViewController {
var canvas = Canvas()
@objc func dizzy() {
}}
class Canvas: UIView {
// public function
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(UIColor.red.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()
}
}
将名为 strokeColor
的 属性 添加到您的 Canvas
:
class Canvas : UIView {
var strokeColor = UIColor.red {
didSet {
self.setNeedsDisplay()
}
}
...
}
在draw(rect:)
中使用strokeColor
:
context.setStrokeColor(strokeColor.cgColor)
然后在 dizzy()
中将 canvas' strokeColor
设置为 .blue
:
class ViewController: UIViewController {
var canvas = Canvas()
@objc func dizzy() {
canvas.strokeColor = .blue
}
}
任何时候设置 Canvas
的 strokeColor
,它都会通过在其 didSet
属性 观察器中调用 self.setNeedsDisplay()
来触发重绘。对 draw(rect:)
的新调用将使用新颜色重绘视图。
当 class View Controller 中的 func dizzy 被调用时,我的代码试图将线条的颜色从红色更改为蓝色。问题是我不知道如何从 class 视图控制器做到这一点。我可以在 class Canvas 中完成,但我需要从 func dizzy 中控制它,因为它在 class viewController.I 中用作按钮不在乎我是否必须创建canvas func 中的一个 func,然后从 viewController 中调用它。
class ViewController: UIViewController {
var canvas = Canvas()
@objc func dizzy() {
}}
class Canvas: UIView {
// public function
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(UIColor.red.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()
}
}
将名为 strokeColor
的 属性 添加到您的 Canvas
:
class Canvas : UIView {
var strokeColor = UIColor.red {
didSet {
self.setNeedsDisplay()
}
}
...
}
在draw(rect:)
中使用strokeColor
:
context.setStrokeColor(strokeColor.cgColor)
然后在 dizzy()
中将 canvas' strokeColor
设置为 .blue
:
class ViewController: UIViewController {
var canvas = Canvas()
@objc func dizzy() {
canvas.strokeColor = .blue
}
}
任何时候设置 Canvas
的 strokeColor
,它都会通过在其 didSet
属性 观察器中调用 self.setNeedsDisplay()
来触发重绘。对 draw(rect:)
的新调用将使用新颜色重绘视图。