Почему CATransform3DMakeRotation не принимает (0,0,1) за вращение вокруг оси Z?

Если я сделаю преобразование в NSView в приложении Cocoa:

self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI / 180, 0, 0, 1);

Я вижу, что квадрат не вращается вокруг оси Z, а вращается так, как будто этот вектор указывает вниз и наружу. мне нужно сделать это

self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI / 180, 1, 1, 1);

чтобы заставить его вращаться вокруг оси Z, как показано на рисунке в этот вопрос.

Однако, если я установлю NSTimer, а затем обновлю transform в методе update, то с помощью

-(void) update:(id) info {
    self.view.layer.transform = 
                  CATransform3DMakeRotation(self.degree * M_PI / 180, 0, 0, 1);
    self.degree += 10;
}

(на этот раз с использованием (0, 0, 1)) будет работать: он вращается вокруг оси Z. Интересно, почему (1, 1, 1) нужен внутри applicationDidFinishLaunching, а (0, 0, 1) можно использовать в методе update?


person Jeremy L    schedule 13.09.2012    source источник


Ответы (1)


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

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{    
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)];

    [self.window.contentView addSubview:self.view];

    self.view.wantsLayer = YES;
    self.view.layer = [CALayer layer];

    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor];
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5);
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI / 180, 0, 0, 1); 
}

кроме того, строка self.view.layer = [CALayer layer]; должна быть после строки self.view.wantsLayer = YES;. Почему именно этот порядок, я не уверен, но он работает так, как должен. Я пока не могу найти документы, в которых упоминается требование для этого заказа, но приведенный выше код работает. Я обновлю ответ, когда найду больше информации о том, зачем нужен заказ.

person Jeremy L    schedule 15.09.2012
comment
Это решило связанную с этим проблему моего приложения только для macOS 10.13: точка привязки всегда менялась с центра на (0,0). Спасибо! - person Jiulong Zhao; 29.03.2018