在Cocoa中以平铺图案绘制图像

时间:2012-02-20 05:52:30

标签: objective-c macos cocoa

我想在我的Cocoa mac应用程序中以简单的tile模式在NSView drawRect中绘制NSImage。一种方法是使用drawInRect编写一个循环来多次绘制此图像:fromRect:operation:fraction:

有更直接的方法吗?

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:5)

Kurt Revis的回答是最简单的方法。如果您需要更多地控制图像的平铺方式(您希望缩放,旋转或平移图像),则可以使用CGContextDrawTiledImage。您需要get a CGImageRef for the NSImage,并且需要get the CGContextRefcurrent NSGraphicsContext

答案 2 :(得分:4)

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