2012-08-24 5 views
1

따라 각각의 측면은 각각에 하위 뷰로서 첨가 이는의 CALayer (6) CATransformLayers (3D 변환을 가능하게하기 위해). 이 6 개의 CATransformLayers는 단일 CATransformLayer에 하위보기로 추가됩니다.회전 CATransformLayer 6 개 측면 이루어지는 큐브를 내장 anchorpoint

전체 큐브를 하나의 패키지로 유지하는이 단일 CATransformLayer를 회전하면 모든 것이 작동하고 앵커 포인트는 0,0으로 설정되고 앵커 포인트 Z는 큐브 중앙으로 설정됩니다. 큐브는 중심을 중심으로 완벽하게 회전합니다.

문제 : 왼쪽, 오른쪽, 위아래의 변이 사용자쪽으로 90 ° 회전하지만 여전히 옆쪽에 붙어있는 현재 옆면의 4 개의 이웃면을 펼치고 싶습니다. 사용자를 향해있다.

예를 들어, 현재 측 위의 측면의 앵커 포인트 Z를 0으로 설정하고 앵커 포인트를 (0.5,1)로 설정하여 앵커 포인트가 기본적으로 공통 에지의 중간에 오도록합니다. 이 부분은 작동하지 않습니다

transformLayer = [CATransformLayer layer]; 
transformLayer.position = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2); 

CGRect layerRect = CGRectMake(0.0, 0.0, 150, 150); //frame rect for cube sides 
CGPoint screenCenter = CGPointMake(self.transformLayer.bounds.size.width/2, self.transformLayer.bounds.size.height/2); 

//side1 
side1 = [CALayer layer]; 
side1.borderColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side1.backgroundColor = [UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side1.borderWidth = 2.0; 
side1.cornerRadius = 30.0; 
side1.frame = layerRect; 
side1.position = screenCenter; 


side1t = [CATransformLayer layer]; 
[side1t addSublayer:side1]; 


//side2 
side2 = [CALayer layer]; 
side2.borderColor = [UIColor colorWithHue:0.25 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side2.backgroundColor = [UIColor colorWithHue:0.25 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side2.borderWidth = 2.0; 
side2.cornerRadius = 30.0;  
side2.frame = layerRect; 
side2.position = screenCenter; 
//positioning 
CATransform3D rotation = CATransform3DMakeRotation(M_PI/2, 0.0, 1.0, 0.0); 
CATransform3D translation = CATransform3DMakeTranslation(150/2, 0.0, 150/-2); 
CATransform3D position = CATransform3DConcat(rotation, translation); 
side2.transform = position; 

side2t = [CATransformLayer layer]; 
[side2t addSublayer:side2]; 


//side3 
side3 = [CALayer layer]; 
side3.borderColor = [UIColor colorWithHue:0.0 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side3.backgroundColor = [UIColor colorWithHue:0.0 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side3.borderWidth = 2.0; 
side3.cornerRadius = 30.0; 
side3.frame = layerRect; 
side3.position = screenCenter; 
//positioning 
translation = CATransform3DMakeTranslation(0.0, 0.0, -150); //150 
side3.transform = translation; 

side3t = [CATransformLayer layer]; 
[side3t addSublayer:side3]; 


//side4 
side4 = [CALayer layer]; 
side4.borderColor = [UIColor colorWithHue:0.2 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side4.backgroundColor = [UIColor colorWithHue:0.2 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side4.borderWidth = 2.0; 
side4.cornerRadius = 30.0; 
side4.frame = layerRect; 
side4.position = screenCenter; 
//positioning 
rotation = CATransform3DMakeRotation(M_PI/2, 0.0, 1.0, 0.0); 
translation = CATransform3DMakeTranslation(150/-2, 0.0, 150/-2); 
side4.transform = CATransform3DConcat(rotation, translation); 

side4t = [CATransformLayer layer]; 
[side4t addSublayer:side4]; 


//side5 
side5 = [CALayer layer]; 
side5.borderColor = [UIColor colorWithHue:0.8 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side5.backgroundColor = [UIColor colorWithHue:0.8 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side5.borderWidth = 2.0; 
side5.cornerRadius = 30.0; 
side5.frame = layerRect; 
side5.position = screenCenter; 
//positioning 
rotation = CATransform3DMakeRotation(M_PI/2, 1.0, .0, 0.0); 
translation = CATransform3DMakeTranslation(0.0, 150/-2, 150/-2); 
side5.transform = CATransform3DConcat(rotation, translation); 

side5t = [CATransformLayer layer]; 
[side5t addSublayer:side5]; 


//side6 
side6 = [CALayer layer]; 
side6.borderColor = [UIColor colorWithHue:0.0845 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
side6.backgroundColor = [UIColor colorWithHue:0.0845 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
side6.borderWidth = 2.0; 
side6.cornerRadius = 30.0; 
side6.frame = layerRect; 
side6.position = screenCenter; 
//positioning 
rotation = CATransform3DMakeRotation(M_PI/2, 1.0, .0, 0.0); 
translation = CATransform3DMakeTranslation(0.0, 150/2, 150/-2); 
side6.transform = CATransform3DConcat(rotation, translation); 

side6t = [CATransformLayer layer]; 
[side6t addSublayer:side6]; 


[self.transformLayer addSublayer:side1t]; 
[self.transformLayer addSublayer:side2t]; 
[self.transformLayer addSublayer:side3t]; 
[self.transformLayer addSublayer:side4t]; 
[self.transformLayer addSublayer:side5t]; 
[self.transformLayer addSublayer:side6t]; 

self.transformLayer.anchorPointZ = -150/2; 
[self.layer addSublayer: transformLayer]; 

:

큐브를 설정. 회전 (90)은 정확하지만 측면은 완전히 잘못된 위치에 절반 전류 측 앞 cubesize (Z 좌표)와 XY 공간의 전면 측의 피복 절반 스크린

참조 끝낸다
-(void)unfoldUpperSide { 
[CATransaction begin]; 
[CATransaction setAnimationDuration: 3.0]; 
side5t.anchorPoint = CGPointMake(0.5, 0); 
side5t.anchorPointZ = 0; 
side5t.transform = CATransform3DMakeRotation(-M_PI/2, 1, 0, 0); 
[CATransaction commit]; 
} 

after rotation

나는 하루 종일이 붙어 있어요 누군가가 나를 도울 수 있기를 바랍니다 ..!

답변

0

각 레이어에 대해 CATransformLayer를 만들 필요가 없습니다. 단 하나의 CATransformLayer 만 있으면 모든 레이어를 보유 할 수 있으며 CATransformLayer 변형이 레이어의 모든 앵커에 적용되므로 3D 변형을 만들 수 있습니다. 모든면의 anchorPoint이 0.5,0.5 때문에 각 측면에 당신의 회전이 꺼져 왜

당신은 변환하여이 문제를 갈 수 있습니다 (당신이 그 중심을 회전 그래서 각각의 센터이다) 두 개의 원하는 방향으로 크기가 반으로 줄어들지 만 처음에는 약간의 클리핑만으로 회전합니다. 아래의 osx 코드는 NSColor 등을 UIKit에 맞게 변경합니다.

enter image description here

-(void)cubeTest{ 

    float size = 100.0; 

    CATransformLayer *transformLayer = [CATransformLayer layer]; 
    transformLayer.position = CGPointMake(cubeView.bounds.size.width/2,cubeView.bounds.size.height/2); 

    CGRect layerRect = CGRectMake(0.0, 0.0, size, size); //frame rect for cube sides 
    CGPoint screenCenter = CGPointMake(transformLayer.bounds.size.width/2, transformLayer.bounds.size.height/2); 

    //side1 
    CALayer *side1 = [CALayer layer]; 
    side1.borderColor = [NSColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side1.backgroundColor = [NSColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side1.borderWidth = 2.0; 
    side1.cornerRadius = 30.0; 
    side1.frame = layerRect; 
    side1.position = screenCenter; 
    [transformLayer addSublayer:side1]; 

    //side2 
    CALayer *side2 = [CALayer layer]; 
    side2.borderColor = [NSColor colorWithHue:0.25 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side2.backgroundColor = [NSColor colorWithHue:0.25 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side2.borderWidth = 2.0; 
    side2.cornerRadius = 30.0; 
    side2.frame = layerRect; 
    side2.position = screenCenter; 
    //positioning 
    CATransform3D rotation = CATransform3DMakeRotation(M_PI/2, 0.0, 1.0, 0.0); 
    CATransform3D translation = CATransform3DMakeTranslation(size/2, 0.0, size/-2); 
    CATransform3D position = CATransform3DConcat(rotation, translation); 
    side2.transform = position; 
    [transformLayer addSublayer:side2]; 

    //side3 
    CALayer *side3 = [CALayer layer]; 
    side3.borderColor = [NSColor colorWithHue:0.0 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side3.backgroundColor = [NSColor colorWithHue:0.0 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side3.borderWidth = 2.0; 
    side3.cornerRadius = 30.0; 
    side3.frame = layerRect; 
    side3.position = screenCenter; 
    //positioning 
    translation = CATransform3DMakeTranslation(0.0, 0.0, -size); //size 
    side3.transform = translation; 
    [transformLayer addSublayer:side3]; 

    //side4 
    CALayer *side4 = [CALayer layer]; 
    side4.borderColor = [NSColor colorWithHue:0.2 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side4.backgroundColor = [NSColor colorWithHue:0.2 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side4.borderWidth = 2.0; 
    side4.cornerRadius = 30.0; 
    side4.frame = layerRect; 
    side4.position = screenCenter; 
    //positioning 
    rotation = CATransform3DMakeRotation(M_PI/2, 0.0, 1.0, 0.0); 
    translation = CATransform3DMakeTranslation(size/-2, 0.0, size/-2); 
    side4.transform = CATransform3DConcat(rotation, translation); 
    [transformLayer addSublayer:side4]; 

    //side5 
    CALayer *side5 = [CALayer layer]; 
    side5.borderColor = [NSColor colorWithHue:0.8 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side5.backgroundColor = [NSColor colorWithHue:0.8 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side5.borderWidth = 2.0; 
    side5.cornerRadius = 30.0; 
    side5.frame = layerRect; 
    side5.position = screenCenter; 
    //positioning 
    rotation = CATransform3DMakeRotation(M_PI/2, 1.0, .0, 0.0); 
    translation = CATransform3DMakeTranslation(0.0, size/-2, size/-2); 
    side5.transform = CATransform3DConcat(rotation, translation); 
    [transformLayer addSublayer:side5]; 

    //side6 
    CALayer *side6 = [CALayer layer]; 
    side6.borderColor = [NSColor colorWithHue:0.0845 saturation:1.0 brightness:1.0 alpha:1.0].CGColor; 
    side6.backgroundColor = [NSColor colorWithHue:0.0845 saturation:1.0 brightness:1.0 alpha:0.8].CGColor; 
    side6.borderWidth = 2.0; 
    side6.cornerRadius = 30.0; 
    side6.frame = layerRect; 
    side6.position = screenCenter; 
    //positioning 
    rotation = CATransform3DMakeRotation(M_PI/2, 1.0, .0, 0.0); 
    translation = CATransform3DMakeTranslation(0.0, size/2, size/-2); 
    side6.transform = CATransform3DConcat(rotation, translation); 
    [transformLayer addSublayer:side6]; 

    transformLayer.anchorPointZ = -size/2; 
    [cubeView setWantsLayer:YES]; 
    [cubeView.layer addSublayer:transformLayer]; 

    //animate 

    CGFloat perspective = -1.0/10000.0; 
    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

    CATransform3D transform = CATransform3DIdentity; 
    transform.m34 = perspective; 
    transformAnimation.fromValue = [NSValue valueWithCATransform3D:transform]; 

    transform.m34 = perspective; 
    transform = CATransform3DRotate(transform, DEGREES_TO_RADIANS(90) , 1, 0, 0); 

    transformAnimation.toValue = [NSValue valueWithCATransform3D:transform]; 

    transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    transformAnimation.repeatCount = INFINITY; 
    transformAnimation.duration = 10.0; 
    [transformLayer addAnimation:transformAnimation forKey:@"RotateTheBox"]; 

    [self sideAnimation:side1 transform:CATransform3DTranslate(CATransform3DRotate(side1.transform, DEGREES_TO_RADIANS(90) , 1, 0, 0), 0, size/2, size/2)]; 
    [self sideAnimation:side3 transform:CATransform3DTranslate(CATransform3DRotate(side3.transform, DEGREES_TO_RADIANS(-90) , 1, 0, 0), 0, size/2, -size/2)]; 
    [self sideAnimation:side2 transform:CATransform3DTranslate(CATransform3DRotate(side2.transform, DEGREES_TO_RADIANS(90) , 1, 0, 0), 0, size/2, size/2)]; 
    [self sideAnimation:side4 transform:CATransform3DTranslate(CATransform3DRotate(side4.transform, DEGREES_TO_RADIANS(-90) , 1, 0, 0), 0, size/2, -size/2)]; 
    [self sideAnimation:side6 transform:CATransform3DTranslate(side6.transform, 0, 0, size)];//lower cap 

} 

-(void)sideAnimation:(CALayer*)side transform:(CATransform3D)transform 
{ 
    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    transformAnimation.toValue = [NSValue valueWithCATransform3D:transform]; 
    transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    transformAnimation.repeatCount = INFINITY; 
    transformAnimation.duration = 10.0; 
    [side addAnimation:transformAnimation forKey:@"rotateSide"]; 
}