Core Animation:变换

二维空间上的变换

UIViwe可以通过属性transform进行变换,但它实际上只是封装了内部图层的变换。图层与之对应的属性是affineTransform。它们的类型都是CGAffineTransform。设置这个属性,可以进行二维空间上的旋转、缩放和平移。

可以快速生成CGAffineTransform类型的函数:

  • CGAffineTransformMakeTranslation(CGFloat angle)
  • CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
  • CGAffineTransformMakeRotation(CGFloat angle)
    它们分别可以进行平移、缩放和旋转的操作。效果如下:
Core Animation:变换_第1张图片
(图一)CGAffineTransformMakeScale(70, 70)
Core Animation:变换_第2张图片
(图二)CGAffineTransformMakeScale(0.5, 0.5)
Core Animation:变换_第3张图片
(图三)CGAffineTransformMakeRotation(3.14)

还可以利用下面的方法混合不同的变化(CGAffineTransformIdentity为单位矩阵):

  • CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
  • CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)
  • CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)
  • CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2)

需要注意的是,混合不同的变化时,后面的变化会收到前面变化的影响。例如

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformRotate(transform, 1.0/3*3.14);
transform = CGAffineTransformTranslate(transform, 200, 0);
view.transform = transform;

效果为

Core Animation:变换_第4张图片
(图四)先旋转后平移
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, 200, 0);
transform = CGAffineTransformRotate(transform, 1.0/3*3.14);
view.transform = transform;

效果为

Core Animation:变换_第5张图片
(图五)先平移后旋转

水平方向的位移受到了旋转变换的影响。最终,水平方向的位移为(cos 1.0/3*3.14)*200,垂直方向的位移为(sin 1.0/3*3.14)*200

三维空间上的变换

通过设置CALayertransform属性,可以实现三维空间上的变换。transformCATransform3D类型。可以通过如下几个函数快速生成:

  • CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
  • CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
  • CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)

你可能感兴趣的:(Core Animation:变换)