NSView永久绘制到背景

时间:2014-02-13 20:41:32

标签: objective-c cocoa

我正在尝试在窗户的背景上绘制一些东西。因此,我将窗口的NSView子类化,并添加了一些类似的绘图代码:

- (void)drawRect:(NSRect)dirtyRect {
    float color = 0.95;
    [[NSColor colorWithDeviceRed:color green:color blue:color alpha:1.0] set];
    NSRectFill(NSMakeRect(320, 0, 220, NSHeight(dirtyRect)-60));
}

这很好用,但是只要我打开一个NSComboBox或者我激活了一个复选框,这些元素的背景就会删除我刚绘制的矩形。

我不明白这一点,因为检查例如复选框导致,调用drawRect(我添加了一个NSLog)。只调整窗口大小再次绘制我的矩形。

编辑: 这是问题的截图:

enter image description here

1 个答案:

答案 0 :(得分:2)

我有时会遇到同样的问题。我认为以下是我的用法。

/// .h
@interface BackgroundView1 : NSView {
    NSImage *myImage;
}

// .m
- (void)awakeFromNib {
    [self setupBackgroundImage];
}

- (void)setupBackgroundImage {
    NSColor *c = [NSColor colorWithDeviceRed:0.0f/255.0f green:55.0f/255.0f blue:150.0f/255.0f alpha:1.0f];
    if (myImage == nil)
        myImage = [self createColorImage:NSMakeSize(1,1):c];
}

- (void)drawRect:(NSRect)rect { 
    [myImage drawInRect:NSMakeRect([self bounds].origin.x,[self bounds].origin.y,[self frame].size.width,[self frame].size.height)
               fromRect:NSMakeRect(0,0,[myImage size].width, [myImage size].height)
              operation:NSCompositeCopy
               fraction:1.0];
}

// Start Functions //
- (NSImage *)createColorImage:(NSSize)size :(NSColor *)color {
    NSImage *image = [[NSImage alloc] initWithSize:size];
    NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                             initWithBitmapDataPlanes:NULL
                             pixelsWide:size.width
                             pixelsHigh:size.height
                             bitsPerSample:8
                             samplesPerPixel:4
                             hasAlpha:YES
                             isPlanar:NO
                             colorSpaceName:NSCalibratedRGBColorSpace
                             bytesPerRow:0
                             bitsPerPixel:0];

    [image addRepresentation:rep];
    [image lockFocus]; // Lock focus of image, making it a destination for drawing
    [color set];
    NSRectFill(NSMakeRect(0,0,size.width,size.height));
    [image unlockFocus];
    return image;
}
// End Functions //