2009/08/06

[Objective-C][iPhone sdk]CoreGraphicsを使って図形を表示

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を渡すのだが、これがないために、表示されないのかなと思ったりしました。

とりあえず、またこれにばかり気を取られてしまうと、先に進めなくなってしまうので、とりあえず納得したいと思います。

実行結果はこのようになります。

Photobucket

しかし、一つレイヤーの低いframeworkを使うだけで、もうCラッシュとは。
core graphics frameworkとか言ってほとんど関数だったしなー。

改めてC言語って大切なんだなーっと。

1 件のコメント:

  1. ビューの描画はすべてdrawRectから始るので、
    自作の描画メソッドはそこから呼び出してやる必要があます。

    drawRect:は直訳すれば「矩形を描く」ってことになりますが、
    正確に言えば、引数に与えられた矩形領域の*中身*を描画する場所なのです。

    返信削除