extensionを使ってみる [swift2.2]
前回、タップした瞬間に円を描くサンプルを作成しました。
▶︎ swiftで円を描く [UIGestureRecognizer] [drawInRect] [Context] [swift 2.2] - MILLEN BOX
それを見た方から「extensionを使うといいよ〜」とアドバイス頂きましたのでやってみました。
今回はその方法のメモ。
Githubは以下です。
▶︎GitHub - anthrgrnwrld/oekakiGestureRecognizer at branch
あくまでextensionの使い方のメモですので、「変数をこうした方がいいぜ!」という部分はたくさん含まれていると思われます。
ソースをベタっと貼っときます
extensionUIImage.swift
import UIKit extension UIImage { func drawCircle(size: CGSize, center: CGPoint) -> UIImage { let radius: CGFloat = 20.0 //Drawする円の半径 let red: CGFloat = 1.0 //Drawする色 R let blue: CGFloat = 0.0 //Drawする色 B let green: CGFloat = 0.0 //Drawする色 G let alpha: CGFloat = 1.0 //Drawする色 Alpha UIGraphicsBeginImageContextWithOptions(size, false, 0.0) //コンテキストを取得 //タップした時に描く円のRect let circleRect = CGRectMake(center.x - radius, center.y - radius, radius * 2, radius * 2) self.drawInRect(CGRectMake(0, 0, size.width, size.height)) //コンテキストにimageViewの内容を写す let circlePath = UIBezierPath(ovalInRect: circleRect) //円を描く let color = UIColor(red:red, green:green, blue:blue, alpha:alpha) //透明色を格納 color.setFill() circlePath.fill() let retImage = UIGraphicsGetImageFromCurrentImageContext() //UIImageを取得する UIGraphicsEndImageContext() //コンテキストを閉じる return retImage //UIImageをReturnする } }
ViewController.swift
import UIKit class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let myOekaki = OekakiGestureRecognizer(target: self, action: #selector(ViewController.drawGesture(_:))) self.view.addGestureRecognizer(myOekaki) let size = self.imageView.frame.size //コンテキストのサイズ //(extension対策)self.imageView.imageに所期画像を追加しておく UIGraphicsBeginImageContextWithOptions(size, false, 0.0) self.imageView.image?.drawInRect(CGRectMake(0, 0, size.width, size.height)) self.imageView.image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } internal func drawGesture(sender: AnyObject) { guard let oekakiGesture = sender as? OekakiGestureRecognizer else { print("Oekaki Gesture Error happened.") return } switch oekakiGesture.state { case .Began: let size = self.imageView.frame.size //コンテキストのサイズ let touchPoint = oekakiGesture.locationInView(self.imageView) //タッチ座標を取得 //Drawを実行 -> 結果をUIImageにて取得 //let imageAfterDraw = drawCircle(self.imageView.image, size: size, center: touchPoint) let imageAfterDraw = self.imageView.image?.drawCircle(size, center: touchPoint) self.imageView.image = imageAfterDraw default: break } } }
次はprotocolのサンプルを作ってみようと思う今日この頃です。