我正在尝试在我的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);
}
但是,视图会拉伸图像以填充自身。我希望图像重复。
(黑色笔画已经固定)
此外,发生了一些奇怪的事情,因为控制台说图像的大小等于-2109897792x0
,但图像确实是32x32
! WTF?!
答案 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中。