따라 각각의 측면은 각각에 하위 뷰로서 첨가 이는의 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];
}
나는 하루 종일이 붙어 있어요 누군가가 나를 도울 수 있기를 바랍니다 ..!