Это вызывает у меня некоторая боль ...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