SwiftDrawKit is a simple, light-weight drawing framework written in Swift. SwiftDrawKit is built using Core Gaphics and is very easy to implement.
- iOS 13.0+
- Swift 5
- Xcode 12 or higher
This is an Xcode project, so you can directly clone or download the project into your workspace.
git clone https://github.com/jaydeep-godhani/SwiftDrawKit.git
Alternatively, you can download the project as a ZIP file from the GitHub repository page.
To integrate the SwiftDrawView
into your own Xcode project:
- Download or clone the repository.
- Copy the contents of the
DrawKit
folder into your project. - Add
SwiftDrawView
to your storyboard or use it programmatically in your view controllers.
Using SwiftDrawKit is very simple:
Create a SwiftDrawView and add it to your ViewController:
let drawView = SwiftDrawView(frame: self.view.frame)
self.view.addSubview(drawView)
By default, the view will automatically respond to touch gestures and begin drawing. The default brush is .default
, which has a black color.
To disable drawing, simply set the isEnabled
property to false
:
drawView.isEnabled = false
For drawing, we use Brush
to keep track of styles like width
, color
, etc.. We have multiple different default brushes, you can use as follows:
drawView.brush = Brush.default
The default brushed are:
public static var `default`: Brush { get } // black, width 3
public static var thin : Brush { get } // black, width 2
public static var medium : Brush { get } // black, width 7
public static var thick : Brush { get } // black, width 10
public static var marker : Brush { get } // flat red-ish, width 10
public static var eraser : Brush { get } // clear, width 8; uses CGBlendMode to erase things
SwiftDrawView
supports drawing-angle-adjusted brushes. This effectively means, if the user (using an Pencil) draws with the tip of the pencil, the brush will reduce its width a little. If the user draws at a very low angle, with the side of the pencil, the brush will be a little thicker.
You can modify this behavior by setting adjustedWidthFactor
of a brush. If you increase the number (to, say, 5
) the changes will increase. If you reduce the number to 0
, the width will not be adjusted at all.
The default value is 1
which causes a slight de-/increase in width.
This is an opt-in feature. That means, in shouldBeginDrawingIn
, you need to call drawingView.brush.adjustWidth(for: touch)
.
For more customization, you can modify the different properties of a brush to fit your needs.
The color of a line stroke can be changed by adjusting the color
property of a brush. SwiftDrawKit accepts any Color
:
drawView.brush.color = Color(.red)
or
drawView.brush.color = Color(UIColor(colorLiteralRed: 0.75, green: 0.50, blue: 0.88, alpha: 1.0))
We have our own implementation of UIColor
– Color
– to be able to de-/encode it.
The width of a line stroke can be changed by adjusting the width
property of a brush. SwiftDrawKit accepts any positive CGFloat
:
drawView.brush.width = 5.0
The opacity of a line stroke can be changed by adjusting the lineOpacity
property. SwiftDrawKit accepts any CGFloat
between 0
and 1
:
drawView.brush.opacity = 0.5
If you wish to clear the entire canvas, simply call the clear
function:
drawView.clear()
drawView.undo()
...and redo:
drawView.redo()
To en-/disable custom un- & redo buttons, you can use .canUndo
and .canRedo
.
Apple Pencil can be used for drawing in a SwiftDrawView, just like a finger.
Special features, however, regarding Apple Pencil 2 are only supported on iOS 12.1 and above versions.
Apple Pencil interaction is enabled by default, but you can set drawView.isPencilInteractive
to change that setting.
When double tapping the pencil, SwiftDrawKit will check the user preferences set in the system. If the preference is set to switch to eraser, SwiftDrawKit will switch between normal and erasing mode; if set to last used tool, SwiftDrawKit will switch between current and previous brush.
SwiftDrawKit has delegate functions to notify you when a user is interacting with a SwiftDrawView. To access these delegate methods, have your View Controller conform to the SwiftDrawViewDelegate
protocol:
class ViewController: UIViewController, SwiftDrawViewDelegate
func swiftDraw(shouldBeginDrawingIn drawingView: SwiftDrawView, using touch: UITouch) -> Bool
func swiftDraw(didBeginDrawingIn drawingView: SwiftDrawView, using touch: UITouch)
func swiftDraw(isDrawingIn drawingView: SwiftDrawView, using touch: UITouch)
func swiftDraw(didFinishDrawingIn drawingView: SwiftDrawView, using touch: UITouch)
func swiftDraw(didCancelDrawingIn drawingView: SwiftDrawView, using touch: UITouch)
We welcome contributions! If you find a bug, have an idea for a new extension, or want to improve the documentation, feel free to fork the repo and create a pull request.
This project is licensed under the MIT License - see the LICENSE
file for details.