描画用のカスタムビューを用意する
任意の図形を描画するには UIView
のサブクラスを作り、draw(_:)
メソッドをオーバーライドします。描画のパスは UIBezierPath
で作成し、色は UIColor
で指定します。弧を作成するメソッドを利用して円を作成できます。
例: RedCircleView
swift
1 import UIKit
2
3 class RedCircleView : UIView {
4 override init ( frame : CGRect ) {
5 super . init ( frame : frame )
6 prepare ( )
7 }
8
9 required init ? ( coder : NSCoder ) {
10 super . init ( coder : coder )
11 prepare ( )
12 }
13
14 func prepare ( ) {
15 // 背景色を透明にして他のビューの子にしたとき背景色で塗りつぶさないようにする
16 self . backgroundColor = . clear
17
18 // お好みで…………
19 self . autoresizingMask = [ . flexibleWidth , . flexibleHeight ]
20 }
21
22 override func draw ( _ rect : CGRect ) {
23 super . draw ( rect )
24
25 // 中心座標と短辺を計算しておく
26 let center = CGPoint ( x : rect . size . width / 2.0 , y : rect . size . height / 2.0 )
27 let shortSide = min ( rect . size . width , rect . size . height )
28
29 // 円のパスを作成
30 let lineWidth = CGFloat ( 8.0 )
31 let redCircle = UIBezierPath (
32 arcCenter : center , // 弧の中心座標
33 radius : shortSide / 2 - lineWidth , // 半径
34 startAngle : 0 , // 弧の描画開始角度
35 endAngle : CGFloat ( Double . pi ) * 2 , // 弧の描画終了角度
36 clockwise : true // 時計回りに描画するか
37 )
38
39 // 線の色と太さをセットして描画
40 UIColor ( red : 1 , green : 0 , blue : 0 , alpha : 1 ) . setStroke ( )
41 redCircle . lineWidth = lineWidth
42 redCircle . stroke ( )
43 }
44 }
タップジェスチャーのアクションでイメージビューに貼り付ける
イメージビューと同じ大きさのカスタムビューを生成して貼り付ければイメージビューの中に赤い丸を描画できます。
swift
1 import UIKit
2
3 class ViewController : UIViewController {
4 @IBOutlet weak var imageView : UIImageView !
5
6 @IBAction func didTapImageView ( _ sender : Any ) {
7 if ( self . imageView . viewWithTag ( 1 ) == nil ) {
8 let redCircleView = RedCircleView ( frame : self . imageView . bounds )
9 redCircleView . tag = 1
10 self . imageView . addSubview ( redCircleView )
11 } else {
12 print ( "Already added a red circle view." )
13 }
14 }
15 }
なお、さらに色々な図形を頻繁に追加・削除するようであれば SpriteKit
でコンテンツを作成するほうが便利ですよ。例えば、円などはシェイプノードを追加するだけなのでカスタムビューが不要です。