完成使用CALayer创建的一个旋转的3D立方体。

完成使用CALayer创建的一个旋转的3D立方体。

 

很简单,注意保持一个清晰的空间想象力,然后把每一个CALayer执行相应的3D变换,最后使用Core Animation是主Layer动起来,OK。

让我们开始动手!首先,在ViewController中定义主Layer,这个CALayer用来存放其他子Layer,我们一共需要6个子Layer,每一个子Layer代表正方体的一个面。

//Layer

CALayer *_rootLayer;

 

接着,也是最重要的,定义一个创建3D变换后的CALayer辅助函数。

这里为了使Layer有渐变色,所以使用CAGradientLayer类型,因此第一步就是设置好CAGradientLayer的那些杂七杂八的属性(颜色,位置等),第二步,从参数中获取偏移和旋转3D变换的值,然后执行相应的变换。具体参数我们会在之后调用这个方法时传入,这里总共需要用来偏移的X,Y,Z参数和用来旋转的角度,X,Y,Z参数,一共7个参数。设置好3D Transform后,这个方法的第三步就是把这个新的Layer加入到主Layer中。

整个方法代码如下:

//用来添加经过3D变换的CALayer

- (void)addLayer:(NSArray*)params

{

    //创建支持渐变背景的CAGradientLayer

    CAGradientLayer *gradient = [CAGradientLayer layer];

    //设置位置,和颜色等参数

    gradient.contentsScale = [UIScreen mainScreen].scale;

    gradient.bounds = CGRectMake(00100100);

    gradient.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));

    gradient.colors = @[(id)[UIColor grayColor].CGColor, (id)[UIColor blackColor].CGColor];

    gradient.locations = @[@0@1];

    gradient.startPoint = CGPointMake(00);

    gradient.endPoint = CGPointMake(01);

   

    //根据参数对CALayer进行偏移和旋转Transform

    CATransform3D transform = CATransform3DMakeTranslation([[params objectAtIndex:0floatValue], [[params objectAtIndex:1floatValue], [[params objectAtIndex:2]floatValue]);

    transform = CATransform3DRotate(transform, [[params objectAtIndex:3floatValue], [[params objectAtIndex:4floatValue], [[params objectAtIndex:5floatValue], [[paramsobjectAtIndex:6floatValue]);

    //设置transform属性并把Layer加入到主Layer

    gradient.transform = transform;

    [_rootLayer addSublayer:gradient];

}

 

接着,在ViewController的viewDidLoad方法内,开始利用这个辅助函数来创建每一个面,注意最后要将主Layer进行一次3D变换,这样才能看出3D效果。

如下代码:

//创建主Layer

_rootLayer = [CALayer layer];

_rootLayer.contentsScale = [UIScreen mainScreen].scale;

_rootLayer.frame = self.view.bounds;

 

//

[self addLayer:@[@0@0@50@0@0@0@0]];

//

[self addLayer:@[@0@0@(-50)@(M_PI)@0@0@0]];

//

[self addLayer:@[@(-50)@0@0@(-M_PI_2)@0@1@0]];

//

[self addLayer:@[@50@0@0@(M_PI_2)@0@1@0]];

//

[self addLayer:@[@0@(-50)@0@(-M_PI_2)@1@0@0]];

//

[self addLayer:@[@0@50@0@(M_PI_2)@1@0@0]];

 

//Layer3D变换

CATransform3D transform = CATransform3DIdentity;

transform.m34 = -1.0 / 700;

//X轴上做一个20度的小旋转

transform = CATransform3DRotate(transform, M_PI / 9100);

//设置CALayersublayerTransform

_rootLayer.sublayerTransform = transform;

//添加Layer

[self.view.layer addSublayer:_rootLayer];

 

OK,这个时候,静态的模型已经定义好了,最后我们要把整个正方体动起来,为了达到更好的视觉效果,之前我们已经对主Layer在X轴上做了20度角的小旋转,而对于动画,我们则需要对主Layer在Z轴上做一个360度的旋转,然后设置动画的重复次数为无限次,这样的话,方块就会无限次得转起来,代码:

//动画

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"];

//0360

animation.toValue = [NSNumber numberWithFloat:2 * M_PI];

//间隔3

animation.duration = 3.0;

//无限循环

animation.repeatCount = HUGE_VALF;

//开始动画

[_rootLayer addAnimation:animation forKey:@"rotation"];

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iOS中使用CAShapeLayer进行绘图是一种非常方便和高效的方法。CAShapeLayer是一个类似于CALayer的图层,它可以用来绘制矢量图形。使用CAShapeLayer可以避免使用Core Graphics绘图时可能遇到的一些性能问题。 下面是一个简单的例子,演示如何使用CAShapeLayer绘制一个圆形: 1. 创建CAShapeLayer对象 ``` CAShapeLayer *circleLayer = [CAShapeLayer layer]; ``` 2. 设置CAShapeLayer的属性 ``` // 设置填充颜色 circleLayer.fillColor = [UIColor clearColor].CGColor; // 设置描边颜色 circleLayer.strokeColor = [UIColor redColor].CGColor; // 设置描边宽度 circleLayer.lineWidth = 5; // 设置路径 CGFloat radius = 50; circleLayer.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, radius*2, radius*2)].CGPath; // 设置位置 circleLayer.position = CGPointMake(100, 100); ``` 3. 将CAShapeLayer添加到视图中 ``` [self.view.layer addSublayer:circleLayer]; ``` 这样,一个圆形就被绘制出来了。 除了绘制基本图形,还可以通过CAShapeLayer绘制复杂的路径,例如: ``` CAShapeLayer *pathLayer = [CAShapeLayer layer]; UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(100, 100)]; [path addLineToPoint:CGPointMake(200, 200)]; [path addLineToPoint:CGPointMake(100, 300)]; [path addLineToPoint:CGPointMake(0, 200)]; [path closePath]; pathLayer.path = path.CGPath; pathLayer.strokeColor = [UIColor redColor].CGColor; pathLayer.fillColor = [UIColor clearColor].CGColor; pathLayer.lineWidth = 5; [self.view.layer addSublayer:pathLayer]; ``` 这个例子中,我们使用UIBezierPath创建了一个具有四个顶点的路径,并将其添加到CAShapeLayer中,然后将CAShapeLayer添加到视图中。 使用CAShapeLayer进行绘图非常方便和高效。希望这篇回答对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值