libro
www.tuyano.com
初心者のためのiphone/ipadプログラミング入門

UIViewとグラフィックの描画 (2/4)

作成:2011-04-11 07:57
更新:2011-04-11 07:57

■UIViewのサブクラスを作って組み込む

では、UIViewのサブクラスを作成しましょう。<新規ファイル(またはNew File)>メニューを選び、「iOS」にある「Objective-C class」を選択して新しいクラスを作ります(Xcode 4の場合、「Cocoa Touch」の中にあります)。これで、UIViewのサブクラスとして新しいクラスを作成します。クラス名は「MySampleView」としておくことにしましょう。

これで、「MySampleView.h」「MySampleView.m」という2つのファイルが作成されます。クラスを作成したら、続いて画面に表示する部品を、このMySampleViewに変更する作業を行います。

プロジェクトでは、MyWindow.xibMyViewAppViewController.xibという2つのInterface Builderファイルが作成されていますね。このうち、MyWindow.xibは、例によってウインドウのベースとなるものです。実際にウインドウに組み込まれて表示される画面は、MyViewAppViewControllerのほうにあります。

このMyViewAppViewController.xibをInterface Builderで開いてください。そして、Identity Inspectorから、「Class」のポップアップメニューにある「MySampleView」を選びます。これで、ここに配置されたUIViewは、MySampleViewのインスタンスに変更されます。

では、作成されたMySampleViewクラスのソースコードを見てみましょう。下のリスト欄に、.hファイルと.mファイルのソースコードを掲載しておきます(なお、ソースコード冒頭にあるコメントは省略してあります)。

クラスは、「@interface MySampleView : UIView」というようにして、UIViewを継承して作成されていますね。そして.mファイル側では、2つのメソッドが実装されています(なお、これらはXcode 4で生成されます)。

initWithFrame:メソッドは、このクラスが利用される際の初期化処理を用意しておくためのものです。デフォルトでは、superで初期化をしたインスタンスをselfに設定しているだけで、特に処理はありません。

deallocは、インスタンスを破棄する際の処理を用意しておくためのものです。これも、デフォルトでは何もありません。この2つは、要するに「自分でクラスを実装していくときに、インスタンスの作成と破棄の処理をここに書いてくれ」ということで用意されているだけです。

今回の一番のポイントは、実はこれら2つのメソッドではありません。その間にある、コメント部分です。ここには、以下のようなメソッドがコメントとして埋めこまれています。
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
これが、UIViewで画面に描画を行うのに必要なメソッドです。このdrawRect:は、このビューが画面に配置され、表示を更新する必要が生ずると自動的に呼び出されます。ここに描画のための処理を用意すれば、それが必要に応じて自動的に実行され、常に画面に最新の表示がされるようになる、という仕組みになっているのです。

引数には、CGRectというものが渡されていますね。これは構造体で、描画される領域に関する情報を保管しています。この渡されたCGRectの領域内に、このdrawRect:で実行される描画が行われる、というわけです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※MySampleView.h

#import <UIKit/UIKit.h>

@interface MySampleView : UIView {
    
}

@end


※MySampleView.m

#import "MySampleView.h"

@implementation MySampleView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

- (void)dealloc
{
    [super dealloc];
}

@end

※関連コンテンツ

「初心者のためのiphone/ipadプログラミング入門」に戻る