2016-06-09 5 views
0

Примечание: Пожалуйста, игнорируйте цвета, градиенты и размер! Моя забота перспектива не работает, как ожидалосьПерспектива CATransform3D не работает на CATransformLayer

Я пытаюсь добиться вывода, как показано ниже,

enter image description here

Но когда я запускаю мой код это дает мне следующий вывод

enter image description here

Посмотрите на мой код:

CATransformLayer *baseLayer = [CATransformLayer layer]; 
baseLayer.anchorPoint = CGPointZero; 
baseLayer.bounds = self.view.bounds; 
baseLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); 

[self.view.layer addSublayer:baseLayer]; 

CALayer *redLayer = [CALayer layer]; 
redLayer.backgroundColor = [UIColor redColor].CGColor; 
redLayer.frame = CGRectMake(0, 0, 100, 100); 
redLayer.position = CGPointMake(0,0); 
redLayer.anchorPoint = CGPointMake(1, 0.5); // right 
[baseLayer addSublayer:redLayer]; 

CALayer *blueLayer = [CALayer layer]; 
blueLayer.backgroundColor = [UIColor blueColor].CGColor; 
blueLayer.bounds = CGRectMake(0, 0, 600, 100); 
blueLayer.anchorPoint = CGPointMake(1, 0.5); // right 
blueLayer.position = CGPointMake(-50,0); 
[baseLayer addSublayer:blueLayer]; 

CATransform3D transform = CATransform3DIdentity; 
transform.m34 = -1/80; 
transform = CATransform3DRotate(transform, -M_PI_2, 0, 1, 0); 
blueLayer.transform = transform; 

baseLayer.sublayerTransform = CATransform3DRotate(CATransform3DIdentity, degreesToRadians(80), 0, 1, 0); 

ответ

0

Я не делаю эту проблему, но здесь мой обновленный код работает как ожидалось.

CATransformLayer *baseLayer = [CATransformLayer layer]; 
baseLayer.anchorPoint = CGPointZero; 
baseLayer.bounds = self.view.bounds; 
baseLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); 

CALayer *redLayer = [CALayer layer]; 
redLayer.backgroundColor = [UIColor redColor].CGColor; 
redLayer.frame = CGRectMake(0, 0, 1000, 250); 
redLayer.position = CGPointMake(0,0); 
redLayer.anchorPoint = CGPointMake(0, 0.5); // right 
redLayer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI_2,0.0f, 1.0f, 0.0f); 
[baseLayer addSublayer:redLayer]; 

CALayer *blueLayer = [CALayer layer]; 
blueLayer.backgroundColor = [UIColor blueColor].CGColor; 
blueLayer.bounds = CGRectMake(0, 0, 125, 250); 
blueLayer.anchorPoint = CGPointMake(0, 0.5); // right 
blueLayer.position = CGPointMake(0,0); 
[baseLayer addSublayer:blueLayer]; 

CGFloat perspective = -1000.0; //This relates to the m34 perspective matrix. 

CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
rotationAndPerspectiveTransform.m34 = 1.0/perspective; 
rotationAndPerspectiveTransform = CATransform3DRotate(newTransform, degreesToRadians(10) , 0.0f, 1.0f, 0.0f); 


baseLayer.sublayerTransform = rotationAndPerspectiveTransform; 
+1

Проблема заключалась в том, что в C выражение '1/80' выполняется как целочисленное деление и создает' 0'. Когда вы изменили его на «1/перспектива», где «перспектива» имеет тип «CGFloat», вы сделали его с помощью деления с плавающей запятой, которое производит дробный, ненулевой результат. –