2013-02-20 2 views
0

Это вызывает у меня некоторая боль ...drawLayer: InContext: рисует фон над содержанием при использовании Layer-хостинге NSView

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

Вот простой пример. Просто реализуется путем создания нового проекта в Xcode и введя в AddDelegate: (после добавления QuartzCore к проекту):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSView *thisView = [[NSView alloc] initWithFrame:CGRectInset([self.window.contentView bounds], 50, 50)]; 

    [thisView setLayer:[CALayer layer]]; 
    [thisView setWantsLayer:YES]; 
    thisView.layer.delegate = self; 

    thisView.layer.backgroundColor = CGColorCreateGenericRGB(1,1,0,1); 
    thisView.layer.anchorPoint = NSMakePoint(0.5, 0.5); 
    [self.window.contentView addSubview:thisView]; 

    //Create custom content 
    [thisView.layer display]; 
} 

Я также реализовать следующий метод CALayer Делегирование:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    [[NSColor blueColor] setFill]; 
    NSBezierPath *theBez = [NSBezierPath bezierPathWithOvalInRect:layer.bounds]; 
    [theBez fill]; 
} 

Если Я запускаю этот код, я вижу, что subview добавляется к окну contentView (большой желтый прямоугольник), и я предполагаю, что это представление на уровне слоев ... и я вижу, что овальное изображение выделено синим цветом, но оно это внизу желтый прямоугольник, а его начало находится в (0,0) в главном окне ... это похоже на то, что он не является ac втягивается внутри желтого слоя.

Я предполагаю, что мой взгляд на самом деле не является хостингом на уровне, или что контекст, передаваемый на этот слой, неверен ... но почему это было бы внизу?

я должен делать что-то не так ...

Чтобы продолжить странности, если добавить CABasicAnimation к слою, например, так:

CABasicAnimation *myAnimation = [CABasicAnimation animation]; 
myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
myAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
myAnimation.fromValue = [NSNumber numberWithFloat:0.0]; 
myAnimation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)]; 

myAnimation.duration = 1.0; 
myAnimation.repeatCount = HUGE_VALF; 

[thisView.layer addAnimation:myAnimation forKey:@"testAnimation"]; 
thisView.layer.anchorPoint = NSMakePoint(0.5, 0.5); 

Желтый фон получает анимированные, вращающийся вокруг его центр, но синий эллипс правильно рисуется внутри рамки слоя (но также снаружи, в начале окна, так что он там дважды), но не оживляет. Я ожидал бы, что эллипс будет вращаться вместе с остальной частью слоя.

Я сделал этот проект available here для тех, кто хочет дать вам руку.

Renaud

ответ

1

Got it. Меня смутил тот факт, что контекст, вызываемый в этой ситуации, является CGContextRef, а не NSGraphicsContext!

я, кажется, чтобы быть в состоянии получить результат, мне нужно, установив NSGraphicsContext из CGContextRef:

NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:NO]; 
[NSGraphicsContext saveGraphicsState]; 

[NSGraphicsContext setCurrentContext:gc]; 

// Вставить рисунок код здесь

[NSGraphicsContext restoreGraphicsState]; 
Смежные вопросы