2009-11-02 18 views
46

私はUIViewに描画したいUIImageを持っています。しかし、UIImageViewを作成し、これをサブビューとして追加する代わりに、私は-drawRect:を上書きしてUIViewを直接描画したいと思います。例えばUIImageを描画する方法または-drawRectに直接描画する方法:

、私のコードは次のようになります。

- (void)drawRect:(CGRect)rect { 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 

    UIImage *img = [UIImage imageNamed:@"foo.png"]; 

    // how to draw the directly into the view now? 
} 

答えて

83

コール[img drawInRect:rect];

+4

'[img drawAtPoint:point]'もありますが、 'drawInRect:'が好ましいです。 –

+0

可能であれば、この手法を避けてみてください。 drawInRectとdrawAtPointはかなりひどい性能を持っています。 – TomSwift

+1

ありがとうございます。背景画像とテキストを含み、スクロールビューに追加されたビューのこれらの便利な(NSString UIKit描画アドオンと組み合わせて)これらが特に有用であることがわかりました。 drawRectで背景画像とテキストを一緒に描画すると、スクロールのパフォーマンスに重大な影響を与えるQuartzがレイヤをブレンドするのを防ぎます(UIImageViewとUILabelのサブビューアプローチを使用した場合と同じように) – cidered

30

ところで、画像ファイルをdrawRectメソッドで読み込まないでください。このビューが更新される必要があるときはいつでもこのメソッドが呼び出されるためです。したがって、実行中に(もちろん、ロード手順)は何度も呼び出されることがあります。 (さらに、OS2.xのimageNamedメソッドにはバグがあり、画像をキャッシュして漏らしていません)

したがって、初期化メソッドでdrawRectではなくロードすることをお勧めします。

+0

その有益な情報をありがとう。残念ながら、どの「初期化」メソッドを意味しますか? – geforce

+0

彼はおそらく '+(void)initialize'またはあなたがやっていることに応じて通常の' init'メソッドを意味します。 – Mason

関連する問題