2012-02-20 9 views
2

私はCocoa mac appのシンプルなタイルパターンでNSView drawRectにNSImageを描画したいと思います。これを行う1つの方法は、drawInRectを使用してこのイメージを複数回描画するループを作成することです。fromRect:operation:fraction:ココアのタイルパターンで画像を描く

もっと直接的な方法はありますか?

+0

はこの質問へのカップルの良い答えをhttp://stackoverflow.com/q/1125230/643383を参照してください。 。 – Caleb

+0

これは、ココアタッチではなく、これがココアについてのものなので、その質問のかなりのダップではありません。 –

+0

合意。重要なのは、iOSのウィンドウではサイズの変更はほとんどありませんが、Macでは一般的なことです。ウィンドウのサイズ変更は、パターン原点の計算方法によるパターン描画に影響します。 –

答えて

4
NSColor* myColor = [NSColor colorWithPatternImage:myImage]; 
[myColor set]; 
// then treat it like you would any other color, e.g.: 
NSFillRect(myRect); 
+0

colorWithPatternImageのメモリリークの問題がありますか?最近のiOSバージョンで修正されましたか? –

9

あなたはKurtが指摘したようにパターンイメージを使用する必要がありますが、それほど単純ではありません。パターンイメージは、ウィンドウの原点を原点として使用するため、ウィンドウのサイズを変更するとパターンが移動します。

ウィンドウ内のビューの位置に応じて、現在のグラフィックスコンテキストでパターンフェーズを調整する必要があります。私は、NSViewの上で、このカテゴリを使用します。

@implementation NSView (RKAdditions) 
- (void)rk_drawPatternImage:(NSColor*)patternColor inRect:(NSRect)rect 
{ 
    [self rk_drawPatternImage:patternColor inBezierPath:[NSBezierPath bezierPathWithRect:rect]]; 
} 

- (void)rk_drawPatternImage:(NSColor*)patternColor inBezierPath:(NSBezierPath*)path 
{ 
    [NSGraphicsContext saveGraphicsState]; 

    CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]); 
    CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]); 
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)]; 

    [patternColor set]; 
    [path fill]; 
    [NSGraphicsContext restoreGraphicsState]; 
} 

@end 

あなたはこのようにそれを使用したい:

-(void) drawRect: (NSRect)dirtyRect 
{ 
    [self rk_drawPatternImage:[NSColor colorWithPatternImage:yourImage] inRect:self.bounds]; 
}