2015-11-23 5 views
0

Окружающая среда: OS X 10.11 SDK, XCode 7.2, Cocoa;Преобразование CALayer не применяется, если NSView еще не создан в данный момент

Контекст: Некоторая сложная трансформация должна применяться в момент создания представлений;

Когда я пытаюсь добавить NSView программно преобразовать свойство просто игнорируется, если он помещен перед addSubview вызова:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 
    CALayer* newLayer = [CALayer layer]; 

    newLayer.transform = CATransform3DMakeRotation(angle, 0.1f, 0.1f, 0.1f); 

    [newLayer setBackgroundColor:[[NSColor greenColor] CGColor]]; 

    [view setLayer:newLayer]; 
    [view setWantsLayer:YES]; 
    [_window.contentView addSubview:view]; 
} 

- (IBAction)click:(id)sender { 
    angle += 0.1f; 
    [[_window.contentView subviews] objectAtIndex:2].layer.transform = CATransform3DMakeRotation(angle, 0.1f, 0.1f, 0.1f); 
    CATransform3D t = [[_window.contentView subviews] objectAtIndex:2].layer.transform; 
    [[_window.contentView subviews] objectAtIndex:2].layer.edgeAntialiasingMask = !CATransform3DIsIdentity(t); 
} 

screenshot

Если я нажимаю на кнопку, вид будет вращаться в нем должен. Кроме того, применяя преобразование после добавления вида в окно тоже работаешь:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)]; 
    CALayer* newLayer = [CALayer layer]; 

    [newLayer setBackgroundColor:[[NSColor greenColor] CGColor]]; 

    [view setLayer:newLayer]; 
    [view setWantsLayer:YES]; 

    [_window.contentView addSubview:view]; 
    view.layer.transform = CATransform3DMakeRotation(angle, 0.1f, 0.1f, 0.1f); 

} 

ли я пропустить некоторые требования или просто не понял, как CALayer преобразования работает?

+0

Есть ли здесь вопрос где-нибудь или вы пытаетесь подать отчет об ошибке, разместив на нем SO? – bhaller

+0

@bhaller Добавил вопрос. Я не думаю, что это ошибка, просто отсутствие знаний. – unknownexception

+0

Если уровни OS X работают так, как работают слои iOS, это вполне ожидаемое поведение. – matt

ответ

0

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

@interface DebuggableView: NSView 
    @property (nonatomic, assign) CATransform3D transform; 
    @property (nonatomic, assign) bool shouldBeTransformed; 
@end; 

@implementation DebuggableView 

- (instancetype) initWithFrame:(NSRect)frameRect 
{ 
    self = [super initWithFrame:frameRect]; 
    if (self) 
    { 
     self.wantsLayer = YES; 
    } 
    return self; 
} 

- (void)layout 
{ 
    [super layout]; 
    if (self.shouldBeTransformed) { 
     self.layer.transform = self.transform; 
     self.shouldBeTransformed = NO; 
    } 
} 

@end