私はCocoa mac appのシンプルなタイルパターンでNSView drawRectにNSImageを描画したいと思います。これを行う1つの方法は、drawInRectを使用してこのイメージを複数回描画するループを作成することです。fromRect:operation:fraction:ココアのタイルパターンで画像を描く
もっと直接的な方法はありますか?
私はCocoa mac appのシンプルなタイルパターンでNSView drawRectにNSImageを描画したいと思います。これを行う1つの方法は、drawInRectを使用してこのイメージを複数回描画するループを作成することです。fromRect:operation:fraction:ココアのタイルパターンで画像を描く
もっと直接的な方法はありますか?
NSColor* myColor = [NSColor colorWithPatternImage:myImage];
[myColor set];
// then treat it like you would any other color, e.g.:
NSFillRect(myRect);
colorWithPatternImageのメモリリークの問題がありますか?最近のiOSバージョンで修正されましたか? –
クルトレヴィスの答えは最も簡単な方法です。画像のタイル表示方法(拡大縮小、回転、または平行移動)をさらに細かく制御する必要がある場合は、CGContextDrawTiledImage
を使用できます。 get a CGImageRef
for the NSImage
が必要で、current NSGraphicsContext
のget the CGContextRef
が必要です。
素晴らしい答え、ありがとう。 –
あなたは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];
}
はこの質問へのカップルの良い答えをhttp://stackoverflow.com/q/1125230/643383を参照してください。 。 – Caleb
これは、ココアタッチではなく、これがココアについてのものなので、その質問のかなりのダップではありません。 –
合意。重要なのは、iOSのウィンドウではサイズの変更はほとんどありませんが、Macでは一般的なことです。ウィンドウのサイズ変更は、パターン原点の計算方法によるパターン描画に影響します。 –