NSScrollView фоновое изображение в Lion - PullRequest
3 голосов
/ 04 августа 2011

Я работаю над приложением Mac с NSScrollView и хочу, чтобы у NSScrollView было собственное фоновое изображение. Я использовал этот код в пользовательском подклассе documentView NSView:

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

Отображает изображение шаблона в качестве фона для documentView.

Но теперь в Mac OS X Lion NSScrollView отскакивает при прокрутке дальше, чем возможно, показывая уродливый пробел. Как сделать так, чтобы белое пространство также покрывалось фоновым изображением?

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Вместо переопределения drawRect:, используйте метод представления прокрутки setBackgroundColor:, передавая NSColor, который вы создали с изображением образца.

1 голос
/ 14 июня 2012

Вы должны использовать подкласс 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*)scrollView с экземпляром NSScrollView.

0 голосов
/ 01 октября 2011

Поместите свой код drawRect в подкласс NSScrollView.В IB измените NSScrollView, чтобы использовать ваш собственный подкласс вместо NSScrollView.Также обязательно снимите флажок «Рисовать фон» в инспекторе атрибутов представления прокрутки.

...