2016-06-13 25 views
6

Sto provando a disegnare un blocco 3d!Cambia l'angolo di prospettiva da destra a sinistra, in CATransformLayer iOS utilizzando CATransform3D

Utilizzo di 2 livelli e sembra buono in 3d per lato destro. vedere l'immagine allegata.

enter image description here

Quando sto cercando di riutilizzare lo stesso codice per la modifica minore per lato sinistro! sembra strano Vedere l'immagine qui sotto allegata,

enter image description here

Sento che possiamo migliorare, se siamo in grado di cambiare angolo di prospettiva, ma non so come raggiungere questo obiettivo.

utilizzando transform.m34 per prospettiva. Qualsiasi aiuto sarebbe molto apprezzato.

Ecco il codice sorgente che sto utilizzando.

// 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"]; 
} 

risposta

5

qui è il codice di lavoro:

// 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"]; 
} 

Cambia la tua redLayer ancherPoint to (1.0, 0.5) e utilizzare valore negativo di un gle in w0 e w1. La variabilenewWidth (che viene utilizzata per la traduzione) dovrebbe essere un valore negativo per l'animazione sul lato sinistro e un valore positivo per l'animazione sul lato destro.