Cocoa touchフレームワークの一つ下に位置するCoreGraphics Frameworkを使って図形を表示してみたいと思います。
まずは、単純に円を表示してみよかなーと。
Delegate.mを以下のよーにしました。
TestView *testview = [[TestView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; //円をiPhoneに描くメセッドをコール [testview drawCircle]; [window addSubview:testview]; [window makeKeyAndVisible]; |
TestViewクラスは、次の「TestView.h」「TestView.m」で定義、実装を行いました。
/*************************************** TestView.h ***************************************/ #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @interface TestView : UIView { CGContextRef cgContext; } -(void)drawCircle; @end /*************************************** TestView.m ***************************************/ #import "TestView.h" @implementation BustView - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // Initialization code } return self; } - (void)drawRect:(CGRect)rect { // Drawing code } - (void)dealloc { [super dealloc]; } -(void)drawCircle{ //現在のグラフィックスコンテキストを取得 cgContext = UIGraphicsGetCurrentContext(); //ストロークカラーの設定 CGContextSetRGBStrokeColor(cgContext, 1.0, 1.0, 1.0, 1.0); CGContextSetLineWidth(cgContext, 2.0); //カレントポイントから指定した座標に向けて線を引く CGContextStrokeEllipseInRect(cgContext, CGRectMake(10.0, 10.0,10.0,10.0)); //パスに円を追加 CGContextAddEllipseInRect(cgContext, CGRectMake(30.0, 30.0, 60.0, 60.0)); //画面に描画 CGContextStrokePath(cgContext); return; } @end |
実装したのは、drawCircleというメソッドだけで他は、UIViewのデフォルトのままで何も変更していないです。
で、これを実行してみると何も表示されませんでした。
参考にしたのは、以前紹介したこの本です。
なんでかなーと思い、ぐぐってみると、プログラマメモ2: Core Graphicsの練習のためにで、CoreGraphicsを使った図形表示の例が記載されていたのですが、同エントリーで記載されていたsetContentViewメソッドがどーしても、リファレンスを漁っても見つからなかったので、紹介されている方法を断念しました。
で、ひょっとしたら、ひょっとしたらと思い、drawRectメソッドに処理を組みこんだら、なーんと理由はわかりませんが表示できました。
最終的には、このような感じになりました。
Delegate.m
TestView *testview = [[BustView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; [testview drawRect:CGRectMake(1000, 10000, 1000, 1000)]; [window addSubview:bustview]; [window makeKeyAndVisible]; |
TestViewクラス
- (void)drawRect:(CGRect)rect { // Drawing code cgContext = UIGraphicsGetCurrentContext(); //ストロークカラーの設定 CGContextSetRGBStrokeColor(cgContext, 1.0, 1.0, 1.0, 1.0); //カレントポイントから指定した座標に向けて線を引く CGContextStrokeEllipseInRect(cgContext, CGRectMake(30.0, 30.0, 60.0, 60.0)); //ここまで引いた線を画面に描く CGContextStrokePath(cgContext); } |
自作したメソッドだと表示されずに、drawRectだと表示されるのは、何故なのだろうか?
中身が同じまったくといっていいほど変わらないのに、何か納得いかない。
こうして書いてみると、ひょっとしたら、引数にCGRectを渡すのだが、これがないために、表示されないのかなと思ったりしました。
とりあえず、またこれにばかり気を取られてしまうと、先に進めなくなってしまうので、とりあえず納得したいと思います。
実行結果はこのようになります。
しかし、一つレイヤーの低いframeworkを使うだけで、もうCラッシュとは。
core graphics frameworkとか言ってほとんど関数だったしなー。
改めてC言語って大切なんだなーっと。
ビューの描画はすべてdrawRectから始るので、
返信削除自作の描画メソッドはそこから呼び出してやる必要があます。
drawRect:は直訳すれば「矩形を描く」ってことになりますが、
正確に言えば、引数に与えられた矩形領域の*中身*を描画する場所なのです。