2016-06-13 6 views
6

Я пытаюсь нарисовать один 3d-блок!Изменение угла перспективы справа налево, в CATransformLayer iOS с использованием CATransform3D

Использование 2 слоев и хорошо выглядит в 3d для правая сторона. см. прикрепленное изображение.

enter image description here

Когда я пытаюсь повторно использовать тот же код для незначительной модификации для левой! это выглядит странно. См.прикрепленное изображение ниже,

enter image description here

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

используя transform.m34 для перспективы. любая помощь будет принята с благодарностью.

Вот исходный код, который я использую.

// left Bar 
/*{ 
    CGFloat aViewWidth = 1000; 

    CAGradientLayer *blueLayer = [CAGradientLayer layer]; 
    blueLayer.anchorPoint = P(0,0.5); 

    blueLayer.colors = @[ 
         (id)aBarColor.CGColor, 
         (id)[UIColor blackColor].CGColor 
         ]; 
    blueLayer.startPoint = CGPointMake(0.0, 0.5); 
    blueLayer.endPoint = CGPointMake(1.5, 0.5); 

    blueLayer.frame = CGRectMake(125, 0, aViewWidth, 250); 
    blueLayer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI_2, 0.0f, 1.0f, 0.0f); 


    [baseLayer addSublayer:blueLayer]; 

    CAGradientLayer *redLayer = [CAGradientLayer layer]; 

    redLayer.colors = @[ 
         (id)[UIColor whiteColor].CGColor, 
         (id)aBarColor.CGColor 
         ]; 
    redLayer.startPoint = CGPointMake(-10.0, 0.5); 
    redLayer.endPoint = CGPointMake(1.0, 0.5); 
    redLayer.anchorPoint = P(0.5,0.5); 

    redLayer.frame = CGRectMake(0, 0, 125, 250); 

    [baseLayer addSublayer:redLayer]; 

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

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

    baseLayer.sublayerTransform = rotationAndPerspectiveTransform; 

    [self.view.layer addSublayer:baseLayer]; 

    return; 

    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath: @"sublayerTransform"]; 
    transformAnimation.fillMode = kCAFillModeForwards; 
    transformAnimation.removedOnCompletion = NO; 
    { 

     CGFloat w0 = 0; 
     CGFloat w1 = aViewWidth; 

     w0 = w0 * sin(degreesToRadians(10)) - perspective * cos(degreesToRadians(10)); 
     w1 = w1 * sin(degreesToRadians(10)) - perspective * cos(degreesToRadians(10)); 

     CGFloat newWidth = w1 - w0; 
     newWidth = newWidth * 1.2; 

     CATransform3D newTransform = CATransform3DIdentity; 
     newTransform.m34 = 1.0/perspective; 
     newTransform = CATransform3DRotate(newTransform, degreesToRadians(-10) , 0.0f, 1.0f, 0.0f); 
     newTransform = CATransform3DScale(newTransform, 1.0f, 1.0f, 1.0f); 
     newTransform = CATransform3DTranslate(newTransform, newWidth, 0.0f, 0.0f); 

     transformAnimation.toValue = [NSValue valueWithCATransform3D:newTransform]; 
     transformAnimation.duration = 10.0; 
    } 
    [baseLayer addAnimation:transformAnimation forKey:@"transform"]; 
}*/ 

// Right Bar 
{ 
    CGFloat aViewWidth = 1000; 

    CAGradientLayer *redLayer = [CAGradientLayer layer]; 

    redLayer.colors = @[ 
         (id)aBarColor.CGColor, 
         (id)[UIColor blackColor].CGColor 
        ]; 
    redLayer.startPoint = CGPointMake(0.0, 0.5); 
    redLayer.endPoint = CGPointMake(1.5, 0.5); 

    redLayer.frame = CGRectMake(0, 0, aViewWidth, 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]; 

    CAGradientLayer *blueLayer = [CAGradientLayer layer]; 

    blueLayer.colors = @[ 
         (id)[UIColor whiteColor].CGColor, 
         (id)aBarColor.CGColor 
         ]; 
    blueLayer.startPoint = CGPointMake(-10.0, 0.5); 
    blueLayer.endPoint = CGPointMake(1.0, 0.5); 

    blueLayer.frame = CGRectMake(0, 0, 125, 250); 
    blueLayer.anchorPoint = CGPointMake(0, 0.5); // right 
    blueLayer.position = CGPointMake(0,0); 

    [baseLayer addSublayer:blueLayer]; 

    CGFloat perspective = -1 * aViewWidth; //This relates to the m34 perspective matrix. 

    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform.m34 = 1.0/perspective; 
    rotationAndPerspectiveTransform = CATransform3DScale(rotationAndPerspectiveTransform, 0.1f, 0.1f, 0.1f); 

    baseLayer.sublayerTransform = rotationAndPerspectiveTransform; 

    [self.view.layer addSublayer:baseLayer]; 

    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath: @"sublayerTransform"]; 
    transformAnimation.fillMode = kCAFillModeForwards; 
    transformAnimation.removedOnCompletion = NO; 
    { 

     CGFloat w0 = 0; 
     CGFloat w1 = aViewWidth; 

     w0 = w0 * sin(degreesToRadians(10)) - perspective * cos(degreesToRadians(10)); 
     w1 = w1 * sin(degreesToRadians(10)) - perspective * cos(degreesToRadians(10)); 

     CGFloat newWidth = w1 - w0; 
     newWidth = newWidth * 1.225; 

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

     transformAnimation.toValue = [NSValue valueWithCATransform3D:newTransform]; 
     transformAnimation.duration = 10.0; 
    } 
    [baseLayer addAnimation:transformAnimation forKey:@"transform"]; 
} 

ответ

5

вот рабочий код:

// left Bar 
{ 
CGFloat aViewWidth = 1000; 

CAGradientLayer *blueLayer = [CAGradientLayer layer]; 
blueLayer.anchorPoint = P(0,0.5); 

blueLayer.colors = @[ 
(id)aBarColor.CGColor, 
(id)[UIColor blackColor].CGColor 
]; 
blueLayer.startPoint = CGPointMake(0.0, 0.5); 
blueLayer.endPoint = CGPointMake(1.5, 0.5); 

blueLayer.frame = CGRectMake(125, 0, aViewWidth, 250); 
blueLayer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI_2, 0.0f, 1.0f, 0.0f); 


[baseLayer addSublayer:blueLayer]; 

CAGradientLayer *redLayer = [CAGradientLayer layer]; 

redLayer.colors = @[ 
(id)[UIColor whiteColor].CGColor, 
(id)aBarColor.CGColor 
]; 
redLayer.startPoint = CGPointMake(-10.0, 0.5); 
redLayer.endPoint = CGPointMake(1.0, 0.5); 

redLayer.anchorPoint = P (1.0,0.5);

redLayer.frame = CGRectMake(0, 0, 125, 250); 

[baseLayer addSublayer:redLayer]; 

CGFloat perspective = -1000; //This relates to the m34 perspective matrix. 
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
rotationAndPerspectiveTransform.m34 = 1.0/perspective; 
rotationAndPerspectiveTransform = CATransform3DScale(rotationAndPerspectiveTransform, 0.1f, 0.1f, 0.1f); 
baseLayer.sublayerTransform = rotationAndPerspectiveTransform; 

[self.view.layer addSublayer:baseLayer]; 

CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath: @"sublayerTransform"]; 
transformAnimation.fillMode = kCAFillModeForwards; 
transformAnimation.removedOnCompletion = NO; 
{ 

CGFloat w0 = 0; 
CGFloat w1 = aViewWidth; 
w0 = w0 * sin(degreesToRadians(-10)) - perspective * cos(degreesToRadians(-10)); 
w1 = w1 * sin(degreesToRadians(-10)) - perspective * cos(degreesToRadians(-10)); 
CGFloat newWidth = w1 - w0; 
newWidth = newWidth * 1.2; 

CATransform3D newTransform = CATransform3DIdentity; 
newTransform.m34 = 1.0/perspective; 
newTransform = CATransform3DRotate(newTransform, degreesToRadians(-10) , 0.0f, 1.0f, 0.0f); 
newTransform = CATransform3DScale(newTransform, 1.0f, 1.0f, 1.0f); 
newTransform = CATransform3DTranslate(newTransform, newWidth, 0.0f, 0.0f); 

transformAnimation.toValue = [NSValue valueWithCATransform3D:newTransform]; 
transformAnimation.duration = 10.0; 
} 
[baseLayer addAnimation:transformAnimation forKey:@"transform"]; 
} 

Изменить redLayer ancherPoint to (1.0, 0.5) и использовать отрицательное значение gle в w0 и w1.newWidth (который используется для перевода) переменная должна быть отрицательным значением для анимации левой стороны и положительным значением для анимации правой стороны.

 Смежные вопросы

  • Нет связанных вопросов^_^