Discover how a simple canvas turns your screen into a magic drawing board!
Why Canvas for drawing in iOS Swift? - Purpose & Use Cases
Imagine you want to create a simple app where users can draw their ideas with their finger, like doodling on paper.
Without a canvas, you'd have to track every touch point and manually update the screen pixel by pixel.
Doing this by hand is slow and complicated.
You might miss some points, causing broken lines.
It's hard to erase or change drawings smoothly.
Overall, it feels like trying to paint with a tiny brush on a huge wall without any tools.
A canvas provides a ready-made space to draw shapes, lines, and images easily.
It handles all the touch tracking and drawing updates for you.
You just tell it what to draw and when, and it takes care of the rest.
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { // Manually track points and redraw }
override func draw(_ rect: CGRect) {
// Use canvas to draw lines and shapes
}With a canvas, you can build smooth, interactive drawing apps that feel natural and responsive.
Apps like sketchpads, signature capture, or coloring books use canvas to let users draw freely on the screen.
Manual drawing is complex and error-prone.
Canvas simplifies drawing by managing touch and rendering.
It enables smooth, interactive drawing experiences.
Practice
Solution
Step 1: Understand UIView drawing lifecycle
Custom drawing on a UIView is done by overriding the draw(_:) method.Step 2: Identify the correct method signature
The method draw(_ rect: CGRect) provides the area to draw and is called automatically when the view needs to render.Final Answer:
draw(_ rect: CGRect) -> Option AQuick Check:
Custom drawing uses draw(_:) [OK]
- Confusing draw(_:) with viewDidLoad()
- Trying to draw in layoutSubviews()
- Using updateConstraints() for drawing
Solution
Step 1: Recall the UIKit method for graphics context
UIGraphicsGetCurrentContext() is the correct UIKit function to get the current drawing context.Step 2: Verify method names and usage
Other options are not valid UIKit methods or properties for getting the context.Final Answer:
let context = UIGraphicsGetCurrentContext() -> Option DQuick Check:
Use UIGraphicsGetCurrentContext() to get context [OK]
- Using non-existent methods like CGContext.current()
- Trying to get context outside draw(_:) method
- Confusing UIView methods with graphics context
override func draw(_ rect: CGRect) {
guard let ctx = UIGraphicsGetCurrentContext() else { return }
ctx.setFillColor(UIColor.red.cgColor)
ctx.fill(CGRect(x: 10, y: 10, width: 100, height: 50))
}Solution
Step 1: Analyze fill color and shape
The code sets fill color to red and fills a rectangle at (10,10) with width 100 and height 50.Step 2: Confirm shape and color match
The shape is a rectangle, not a circle, and color is red, not blue.Final Answer:
A red rectangle at position (10,10) sized 100x50 -> Option BQuick Check:
Fill color red + fill rect = red rectangle [OK]
- Assuming default color is blue
- Confusing rectangle with circle
- Forgetting to unwrap context safely
override func draw(_ rect: CGRect) {
let ctx = UIGraphicsGetCurrentContext()
ctx.setFillColor(UIColor.blue.cgColor)
ctx.fillEllipse(in: CGRect(x: 20, y: 20, width: 80, height: 80))
}Solution
Step 1: Check context unwrapping
The context is optional and not safely unwrapped, causing a compile error because ctx is optional.Step 2: Confirm method and color correctness
fillEllipse(in:) and UIColor.blue.cgColor are correct and CGRect is valid.Final Answer:
Missing guard or forced unwrap for context -> Option CQuick Check:
Always unwrap context safely before drawing [OK]
- Ignoring optional context leading to no drawing
- Thinking fillEllipse(in:) is wrong method
- Assuming color cgColor is invalid
Solution
Step 1: Fill rectangle with green color
Set fill color to green and fill the rect to paint the inside.Step 2: Draw black border with stroke
Set stroke color to black, line width to 5, then stroke the rect to draw border.Final Answer:
Fill green then stroke black with line width 5 -> Option AQuick Check:
Fill first, then stroke for border [OK]
- Swapping fill and stroke colors
- Setting line width after stroke call
- Calling stroke before fill
Ready to prove it?
Pass the test and this pattern moves unknown
