4

我正在使用带有 的 Mac 应用程序NSScrollView,并且我希望它NSScrollView具有自定义背景图像。我在自定义 documentView 子类中使用了这段代码NSView

- (void)drawRect:(NSRect)rect {
    [[NSColor colorWithPatternImage:[NSImage imageNamed:@"wood.jpg"]] set];
    NSRectFill(rect);
}

这显示了一个模式图像作为 documentView 的背景。

但是现在在 Mac OS X Lion 中,NSScrollView当滚动得更远时会出现反弹,显示出丑陋的空白。如何使空白区域也被背景图像覆盖?

4

3 回答 3

2

而不是覆盖drawRect:,使用滚动视图的setBackgroundColor:方法,传递您使用图案图像创建的 NSColor 。

于 2011-09-22T18:22:44.723 回答
1

您应该使用 NSScrollView setBackgroundColor 子类化,但是您应该像这样子类化 NSClipView 以将纹理原点固定到顶部:

@implementation MYClipView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
  if (self.drawsBackground)
  {
    NSGraphicsContext* theContext = [NSGraphicsContext currentContext];
    [theContext saveGraphicsState];

    float xOffset = NSMinX([self convertRect:[self frame] toView:nil]);
    float yOffset = NSMaxY([self convertRect:[self frame] toView:nil]);
    [theContext setPatternPhase:NSMakePoint(xOffset, yOffset)];
    NSColor* color = self.backgroundColor;
    [color set];
    NSRectFill([self bounds]);
    [theContext restoreGraphicsState]; 
  }  
  // Note: We don't call [super drawRect:dirtyRect] because we don't need it to draw over our background. 
}

+ (void)replaceClipViewInScrollView:(NSScrollView*)scrollView 
{
  NSView* docView = [scrollView documentView]; //[[scrollView documentView] retain]; 
  MYClipView* newClipView = nil;
  newClipView = [[[self class] alloc] initWithFrame:[[scrollView contentView] frame]]; 
  [newClipView setBackgroundColor:[[scrollView contentView] backgroundColor]];
  [scrollView setContentView:(NSClipView*)newClipView]; [scrollView setDocumentView:docView];
//  [newClipView release]; 
//  [docView release]; 
}
@end

并调用+ (void)replaceClipViewInScrollView:(NSScrollView*)scrollViewNSScrollView 实例。

于 2012-06-14T10:13:33.790 回答
0

将您的 drawRect 代码放在 NSScrollView 子类中。在 IB 中,将 NSScrollView 更改为使用您的自定义子类而不是 NSScrollView。还要确保取消选中滚动视图的属性检查器中的绘制背景。

于 2011-10-01T00:21:34.887 回答