在NSView中重复背景图像

时间:2010-10-10 12:59:44

标签: cocoa drawing nsview nsimage

我正在尝试在我的NSView中绘制一个重复的背景图像,直到现在我还是这样:

// INIT
- (id)initWithFrame:(NSRect)frame {
  if (self = [super initWithFrame:frame]) {
    self.backgroundImage = [NSImage imageNamed:@"progressBackground.pdf"];
  }

  return self;
}

// DRAW
- (void)drawRect:(NSRect)dirtyRect {
  // Draw the background
  [backgroundImage drawInRect:[self bounds]
                     fromRect:NSMakeRect(0.0f, 0.0f, backgroundImage.size.width, backgroundImage.size.height)
                    operation:NSCompositeSourceAtop
                     fraction:1.0f];
  NSLog(@"%dx%d", backgroundImage.size.width, backgroundImage.size.height);
}

但是,视图会拉伸图像以填充自身。我希望图像重复。

alt text (黑色笔画已经固定)

此外,发生了一些奇怪的事情,因为控制台说图像的大小等于-2109897792x0,但图像确实是32x32! WTF?!

有人可以帮帮我吗?感谢。

3 个答案:

答案 0 :(得分:21)

您可以使用+[NSColor colorWithPatternImage:]创建图案颜色,然后使用“颜色”填充背景矩形。那应该做你想要完成的事情。

答案 1 :(得分:17)

我在这里找到了答案,以防止图案从底部绘制,并在窗口调整大小时给出奇怪的效果:

http://www.mere-mortal-software.com/blog/details.php?d=2007-01-08

基本上你需要在drawRect中做的就是保存图形上下文状态,调用方法,绘制模式,然后恢复你的状态。

方法是:

- (void)drawRect:(NSRect)dirtyRect {
    NSGraphicsContext* theContext = [NSGraphicsContext currentContext];
    [theContext saveGraphicsState];
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(0,[self frame].size.height)];
    [self.customBackgroundColour set];
    NSRectFill([self bounds]);
    [theContext restoreGraphicsState]; 
}

我在init方法中初始化了我的背景颜色模式:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.customBackgroundColour = [NSColor colorWithPatternImage:[NSImage imageNamed:@"light-linen-texture.png"]];
    }

    return self;
}

答案 2 :(得分:0)

在Github上查看RMSkinnedView

编辑:RMSkinnedView是一个NSView子类,您可以直接通过用户定义的运行时属性设置多个选项,包括圆角,背景颜色,背景图像模式等。 在Interface Builder中。