3

カスタム描画を追加したいビューがあります。

Nib/Xib ファイルに接続されていないビューでこれを行う方法を知っています

  • メソッドに描画コードを記述します-drawRect:

しかし、私initがビューを使用している場合

[[MyView alloc] initWithNibName:@"MyView" bundle:[NSBundle mainBundle]];

-drawRect:もちろん呼ばれません。以下のコードを実行してみました-viewDidLoad

CGRect rect = [[self view] bounds];

CGContextRef ref = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ref, 2.0);
CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
CGContextAddRect(ref, CGRectMake(1, 1, rect.size.width - 10, rect.size.height - 10));
CGContextStrokePath(ref);
CGContextDrawPath(ref, kCGPathFillStroke);

しかし、何も引かれません。何か案は?

4

3 に答える 3

3

問題は、ビューとそのビューコントローラを交換可能として扱っていることだと思います。たとえば、-[UIView initWithNibName:bundle:]メソッドはありません—それはUIViewControllerメソッドです。

さらに、ビューは実際には描画用の「キャンバス」のようなものではありません。ビューはそれ自体を描画するように求められます。一般的に、「外部」からは引き込まれません。

それで:

  1. UIViewControllerのサブクラスの名前をMyViewからMyViewControllerに変更します。

  2. MyViewという名前の新しいUIViewサブクラスを作成します。

  3. 必要な描画を行う新しいMyViewクラスにメソッドを追加-drawRect:します。

  4. 最後に、Identity Inspectorを使用して、InterfaceBuilderでViewControllerのビューのカスタムクラスをMyViewに設定します。

-[MyView drawRect:]たとえば、これを実装に使用できるはずです。

- (void)drawRect:(CGRect)rect {
    CGRect bounds = [[self view] bounds];

    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(ref, 2.0);
    CGContextSetRGBStrokeColor(ref, 1.0, 1.0, 1.0, 1.0);
    CGContextSetRGBFillColor(ref, 0, 0, 0, 0);
    CGContextAddRect(ref, CGRectMake(1, 1, bounds.size.width - 10, bounds.size.height - 10));
    CGContextStrokePath(ref);
    CGContextDrawPath(ref, kCGPathFillStroke);
}

図面は、渡された更新長方形にクリップされます。

于 2008-12-30T00:44:02.720 に答える
3

制約に応じて、次の 3 つの解決策が考えられます。

  1. Xib ファイルの NSView オブジェクトのクラスをカスタム クラスの 1 つに設定します。「ハードコードされた」 NSView サブクラスを使用してカスタム描画を行う方法を知っていると述べていますが、これは同じように機能します。Xib ファイルが読み込まれると、NSView がデフォルトではなくカスタム クラスのオブジェクトとしてメモリに読み込まれます。Xib でのビューのクラス タイプの変更は、Interface Builder を使用すると簡単です。
  2. Xib ファイルの NSView オブジェクトが、オーバーライドしたくないある種のカスタム ビューである場合は、Interface Builder でそのビューにサブビューを追加し、そのサブビューをデザインのカスタム クラスにするだけです (次のように)。 #1)
  3. 実行時に Xib ファイルの NSView オブジェクトにサブビューをプログラムで追加できます。上記のサンプル コードでは、独自のカスタム NSView サブクラスのインスタンスを作成し、addSubView:メソッドを使用して既存のビューに追加できます。
于 2008-12-29T23:09:18.997 に答える
2

単純なサブビューですべての描画を行い、それをXIBビュー(viewDidLoad内)に追加するのはどうですか?

于 2008-12-29T23:05:45.773 に答える