I have a very simple view that handles touch events and draws accordingly. It's nothing significant, but it does use a bit more CPU than I would like (35%). Again, it is the bare minimum (<90 lines), but I can't really think of a simpler way to draw using user input. What would you change?
import UIKit
class DrawView: UIView {
var mainImageView = UIImageView()
var tempImageView = UIImageView()
var r = CGFloat(0)
var g = CGFloat(0)
var b = CGFloat(0)
var a = CGFloat(1)
var lineWidth = CGFloat(5)
var dot = true
var lastPoint = CGPoint.zeroPoint
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.backgroundColor = UIColor.clearColor()
self.multipleTouchEnabled = false
mainImageView.frame = self.frame
tempImageView.frame = self.frame
self.addSubview(mainImageView)
self.addSubview(tempImageView)
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
dot = true
if let touch = touches.first as? UITouch {
lastPoint = touch.locationInView(self)
}
}
func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {
UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0)
let context = UIGraphicsGetCurrentContext()
tempImageView.image?.drawInRect(self.frame)
CGContextMoveToPoint(context, fromPoint.x, fromPoint.y)
CGContextAddLineToPoint(context, toPoint.x, toPoint.y)
CGContextSetLineCap(context, kCGLineCapRound)
CGContextSetLineWidth(context, lineWidth)
CGContextSetRGBStrokeColor(context, r, g, b, a)
CGContextSetBlendMode(context, kCGBlendModeNormal)
CGContextStrokePath(context)
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
dot = false
if let touch = touches.first as? UITouch {
let currentPoint = touch.locationInView(self)
drawLineFrom(lastPoint, toPoint: currentPoint)
lastPoint = currentPoint
}
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
if dot {
drawLineFrom(lastPoint, toPoint: lastPoint)
}
UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0)
mainImageView.image?.drawInRect(self.frame, blendMode: kCGBlendModeNormal, alpha: a)
tempImageView.image?.drawInRect(self.frame, blendMode: kCGBlendModeNormal, alpha: a)
mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
tempImageView.image = nil
}
func setColor(color: UIColor) {
let components = CGColorGetComponents(color.CGColor)
r = components[0]
g = components[1]
b = components[2]
}
func erase() {
mainImageView.image = nil
}
}