QuartzFun(5)~ビューの編集(2)

2011. 08. 27
6)drawRect:メソッドの実装

drawRect:メソッドは、現在選択されている描画色と描画図形、ならびにドラッグで指定された領域を元にグラフィックスコンテキストを作成します。

旧版の本書では『長方形と楕円を描く』の項目で、太字で強調されていはいませんがcurrentColorが設定されていない場合にredColorを指定する処理がこっそり追加されています。

ただ今回は先のinitWithCoder:メソッド内でcurrentColorを初期化しているので追加しませんでした。
(気になる方は追加してください)

最初にUIGraphicsGetCurrentContext関数で現在のグラフィックスコンテキストを取得します。

次にCGContextSetLineWidthで線幅を、CGContextSetStrokeColorWithColorで線の色、CGContextSetFillColorWithColorで塗りつぶし色を設定します。

色の指定では、現在選択されている色を示すcurrentColorがUIColorオブジェクトなので、CGColorプロパティでCGColorRefに型変換しています。

続いて描画図形の判別を行います。

ビューコントローラQuartzFunViewControllerのアクションメソッドchangeShapeで設定されたプロパティshapeTypeを使用して、switch文で分岐します。

Line)
直線の描画は、CGContextMoveToPointで始点(firstTouch)に移動し、CGContextAddLineToPointで終点(lastTouch)までの直線を追加、最後にCGContextStrokePathで線を描画します。

Rect)
矩形の描画は、CGContextAddRectでcurrentRect矩形のパスを追加し、CGContextDrawPathで、指定された描画モード(kCGPathFillStroke:非ゼロワインディング規則による塗りつぶしと線の描画)でパスを描画します。

※ 非ゼロワインディング規則や偶奇規則についての詳細は『Quartz 2D Programming Guide/Paths/Painting a Path/Filling a Path』や『Adobe/ActionScript 3.0 開発ガイド/表示/描画 API の使用/描画 API の高度な使用/ワインディング規則の定義』などを参照してください。

Ellipse)
楕円の描画は、CGContextAddEllipseInRectでcurrentRect矩形に内接する楕円のパスを追加し、CGContextDrawPathで指定された描画モード(『Rect』と同じkCGPathFillStroke)でパスを描画します。

Image)
画像の描画にはdrawAtPoint:メソッドを用いていますが、引数として指定する座標を原点として右下に画像が貼られます。
今回は指定する座標(ドラッグの始点または終点)を中心に画像を貼るため、画像のsizeプロパティで幅と高さを取得して2で割り、CGPointMake関数で指定された座標からオフセット分として引くことで画像の貼り付け座標を補正しています。
switch文でこの項目を{ }で囲んでいるのは、『二流プログラマの三流な日常/switch文の途中で宣言する』によると、switch文の途中で変数を宣言することができないからで、これを回避するにはswitch文の前に宣言するか、case:ラベルを{ }で囲む必要があるためです。


UIGraphicsGetCurrentContext

CGContextRef UIGraphicsGetCurrentContext (
    void
);

戻り値は、現在のグラフィックスコンテキストです。

デフォルトでは、現在のグラフィックスコンテキストはnilです。

drawRect:メソッドの呼び出しより前に、ビューオブジェクトはスタックに有効なコンテキストをプッシュし、最新のものとします。

描画でUIViewオブジェクトを使用しない場合は、UIGraphicsPushContext関数を使用して、手動で有効なコンテキストをスタックにプッシュする必要があります。

この関数は、アプリケーションのメインスレッドからのみ呼び出す必要があります。


CGContextSetLineWidth

void CGContextSetLineWidth (
    CGContextRef c,
    CGFloat width
);

グラフィックスコンテキストの線幅を設定します。

デフォルトの線幅は1単位です。

ストロークする時、線は幅が半分ずつになるようにパスを跨いでいます。

c:変更するグラフィックスコンテキストを指定します。

width:ユーザ空間の単位で使用する新規の線幅を指定します。
値は0より大きい必要があります。


CGContextSetStrokeColorWithColor

void CGContextSetStrokeColorWithColor (
    CGContextRef c,
    CGColorRef color
);

Quartzのカラーを使用して、コンテキスト内の現在のストローク色を設定します。

c:変更するグラフィックスコンテキストを指定します。

color:新しいストローク色を指定します。


CGContextSetFillColorWithColor

void CGContextSetFillColorWithColor (
    CGContextRef c,
    CGColorRef color
);

Quartzのカラーを使用して、グラフィックスコンテキスト内の現在の塗りつぶし色を設定します。

c:塗りつぶし色を設定するグラフィックスコンテキストを指定します。

color:新しい塗りつぶし色を指定します。


CGColor

@property(nonatomic,readonly) CGColorRef CGColor

レシーバの色に対応するQuartzの色の参照です。(読み込みのみ)


CGContextMoveToPoint

void CGContextMoveToPoint (
    CGContextRef c,
    CGFloat x,
    CGFloat y
);

指定したポイントから新しいサブパスを開始します。

現在のポイントはこの開始地点に設定されます。

c:グラフィックスコンテキストを指定します。

x:ユーザ空間座標内でのポイントのx値を指定します。

y:ユーザ空間座標内でのポイントのy値を指定します。


CGContextAddLineToPoint

void CGContextAddLineToPoint (
    CGContextRef c,
    CGFloat x,
    CGFloat y
);

現在のポイントから指定したポイントまでの直線を追加します。

線分を追加した後で、現在のポイントは線分の終点に設定されます。

c:現在のパスが空ではないグラフィックスコンテキストを指定します。

x:ユーザ空間内での線分の終点となるx値を指定します。

y:ユーザ空間内での線分の終点となるy値を指定します。


CGContextStrokePath

void CGContextStrokePath (
    CGContextRef c
);

現在のパスの沿った線を描画します。

Quartzはパスを描画するために、グラフィックス状態の線幅とストローク色を使用します。

この関数を呼び出したときの副作用として、Quartzは現在のパスをクリアします。

c:グラフィックスコンテキストを指定します。


CGContextAddRect

void CGContextAddRect (
    CGContextRef c,
    CGRect rect
);

現在のパスに矩形のパスを追加します。

これは以下のような一連の工程で、パスへ矩形を追加する便利な関数です。

// start at origin
CGContextMoveToPoint (c, CGRectGetMinX(rect), CGRectGetMinY(rect));

// add bottom edge
CGContextAddLineToPoint (c, CGRectGetMaxX(rect), CGRectGetMinY(rect));

// add right edge
CGContextAddLineToPoint (c, CGRectGetMaxX(rect), CGRectGetMaxY(rect);

// add top edge
CGContextAddLineToPoint (c, CGRectGetMinX(rect), CGRectGetMaxY(rect));

// add left edge and close
CGContextClosePath (c);

c:グラフィックスコンテキストを指定します。

rect:ユーザ空間座標内での矩形を指定します。


CGContextDrawPath

void CGContextDrawPath (
    CGContextRef c,
    CGPathDrawingMode mode
);

指定された描画モードを使用して、現在のパスを描画します。

c:描画するパスを含むグラフィックスコンテキストを指定します。

mode:パスの描画モード定数(kCGPathFillkCGPathEOFillkCGPathStrokekCGPathFillStrokekCGPathEOFillStroke)を指定します。
定数の詳細については『CGPath』を参照してください。


CGPathDrawingMode

enum CGPathDrawingMode {
    kCGPathFill,
    kCGPathEOFill,
    kCGPathStroke,
    kCGPathFillStroke,
    kCGPathEOFillStroke
};
typedef enum CGPathDrawingMode CGPathDrawingMode;

関数CGContextDrawPathにパスの描画モードの定数を渡して、どのようにQuartzがグラフィックスコンテキストの現在のパスを描画するかを指定します。

kCGPathFill

非ゼロワインディング規則を使用して、パス内に含まれている領域を描画します。

kCGPathEOFill

偶奇規則を使用してパス内の領域を描画します。

kCGPathStroke

パスに沿って線を描画します。

kCGPathFillStroke

First fill and then stroke the path, using the nonzero winding number rule.
非ゼロワインディング規則を使用して、塗りつぶした後にパスの線を描きます。

kCGPathEOFillStroke

偶奇規則を使用して、塗りつぶした後にパスの線を描きます。


CGContextAddEllipseInRect

void CGContextAddEllipseInRect (
    CGContextRef context,
    CGRect rect
);

指定した矩形に内接する楕円を追加します。

楕円はベジェ曲線の連続によって近似されます。

その中心はrect変数によって定義された矩形の中点です。

矩形が正方形の場合、楕円は矩形の幅(または高さ)の半分と等しい半径の円となります。

rect変数が長方形の形状を指定した場合は、楕円の長軸と短軸は長方形の幅と高さによって定義されます。

楕円はパスの完全なサブパスで形成されています。

正確に言うと、楕円の描画は移動操作から始まり、全ての移動方向は右回りで、サブパスを閉じる操作で終了します。

context:グラフィックスコンテキストを指定します。

rect:楕円が内接する領域を定義する矩形を指定します。


drawAtPoint:

- (void)drawAtPoint:(CGPoint)point

現在のコンテキスト内の指定した点に画像を描画します。

このメソッドは、画像の向きの設定を尊重し、現在のグラフィックスコンテキスト内に画像全体を描画します。

デフォルトの座標系では、画像は指定された点の右下に配置されます。

このメソッドは現在のグラフィックスコンテキストに適用されている任意の変換を尊重します。

このメソッドはkCGBlendModeNormalブレンドモードを使用して、完全に不透明で画像を描画します。

point:画像を描画する左上角の点を指定します。


CGPointMake

CGPoint CGPointMake (
    CGFloat x,
    CGFloat y
);

指定した座標の点を返します。

x:構築する点のx座標を指定します。

y:構築する点のy座標を指定します。



参考文献

iOS Viewプログラミングガイド

二流プログラマの三流な日常/switch文の途中で宣言する

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






Lifestyle 650 home entertainment system
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
10 | 2017/11 | 12
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Lifestyle 650 home entertainment system
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR