Фоновое изображение NSScrollView в Lion

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

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

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

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


person icant    schedule 04.08.2011    source источник
comment
Привет! Какой класс вы создали подклассом, чтобы переопределить этот метод? Как отправить изображение на обороте? пс. Ваш фон скользит правильно и привязан к вершине?   -  person aneuryzm    schedule 14.02.2013


Ответы (3)


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

person Aaron Dodson    schedule 22.09.2011
comment
Спасибо, но у меня это не работает, потому что тогда фон не прокручивается. Он зафиксирован в ScrollView. - person icant; 23.09.2011

Вы должны использовать подкласс 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.

person Yoav    schedule 14.06.2012

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

person sam    schedule 01.10.2011