2012-02-20 2 views
2

Я хотел бы нарисовать NSImage в NSView drawRect в простой схеме плитки в моем приложении Mac Cocoa. Один из способов сделать это - просто написать цикл для рисования этого изображения несколько раз с помощью drawInRect: fromRect: operation: fraction:Рисование изображения в шаблоне плитки в Cocoa

Есть ли более прямой метод?

+0

См http://stackoverflow.com/q/1125230/643383 хороших ответов на этот вопрос , – Caleb

+0

Не совсем такой вопрос, потому что этот вопрос касается какао, а не какао-Touch. –

+0

Согласен. Это важно, потому что в iOS-окнах очень редко изменяются размеры, но на Mac это обычное явление. Изменение размера окна влияет на рисунок рисунка из-за того, как рассчитывается начало шаблона. –

ответ

4
NSColor* myColor = [NSColor colorWithPatternImage:myImage]; 
[myColor set]; 
// then treat it like you would any other color, e.g.: 
NSFillRect(myRect); 
+0

Имеет ли проблема с утечкой памяти colorWithPatternImage: исправлена ​​ли последняя версия iOS? –

5

Ответ Курта Ревиза - самый простой способ. Если вам нужно больше контролировать, как изображение разбито (вы хотите масштабировать, поворачивать или переводить его), вы можете использовать CGContextDrawTiledImage. Вам нужно будет get a CGImageRef for the NSImage, и вам нужно будет get the CGContextRefcurrent NSGraphicsContext.

+0

Фантастический ответ, спасибо. –

9

Вам нужно использовать образ изображения, как указал Курт, но это не так просто. Образцы рисунка используют начало окна в качестве точки начала координат, поэтому, если вы измените размер окна, образец будет перемещаться.

Вам нужно отрегулировать фазу шаблона в текущем графическом контексте в зависимости от того, где вид экрана находится в окне. Я использую эту категорию на NSView:

@implementation NSView (RKAdditions) 
- (void)rk_drawPatternImage:(NSColor*)patternColor inRect:(NSRect)rect 
{ 
    [self rk_drawPatternImage:patternColor inBezierPath:[NSBezierPath bezierPathWithRect:rect]]; 
} 

- (void)rk_drawPatternImage:(NSColor*)patternColor inBezierPath:(NSBezierPath*)path 
{ 
    [NSGraphicsContext saveGraphicsState]; 

    CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]); 
    CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]); 
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)]; 

    [patternColor set]; 
    [path fill]; 
    [NSGraphicsContext restoreGraphicsState]; 
} 

@end 

Вы бы использовать его как это: для пары

-(void) drawRect: (NSRect)dirtyRect 
{ 
    [self rk_drawPatternImage:[NSColor colorWithPatternImage:yourImage] inRect:self.bounds]; 
} 
Смежные вопросы