Повторение фонового изображения в NSView - PullRequest
8 голосов
/ 10 октября 2010

Я пытаюсь нарисовать повторяющееся фоновое изображение в моем 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);
}

Однако вид растягивает изображение, чтобы заполнить себя. Я хочу, чтобы изображение повторилось.

alt text (черные штрихи уже исправлены)

Кроме того, происходит нечто странное, так как консоль говорит, что размер изображения равен -2109897792x0, но изображение действительно 32x32! WTF?!

Может ли кто-нибудь помочь мне, пожалуйста? Спасибо.

Ответы [ 3 ]

21 голосов
/ 10 октября 2010

Вы можете создать цвет шаблона с помощью + [NSColor colorWithPatternImage:] , а затем просто залить фоновый прямоугольник этим «цветом». Это должно делать то, что вы хотите достичь.

17 голосов
/ 14 сентября 2011

Я нашел ответ здесь, чтобы не допустить рисования шаблонов снизу и придания этого странного эффекта при изменении размеров окон:

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;
}
0 голосов
/ 29 декабря 2013

Проверьте RMSkinnedView на Github!

РЕДАКТИРОВАТЬ: RMSkinnedView - это подкласс NSView, где вы можете настроить несколько параметров, включая закругленные углы, цвет фона, рисунок фона и т. Д.,непосредственно через определенные пользователем атрибуты времени выполнения в Интерфейсном Разработчике.

...