IOS 3D旋转实现介绍

IOS 3D旋转实现介绍,第1张

前沿

最近遇到一个需求,关于3D旋转问题

由于公司内部保密机制,图片无法上传,我这边简单介绍下

需求:类似星际图一样的效果,中间图在自转,其他有一些小视图围绕着中间视图转,并且有近大远小的效果

实现

这个需求拆分成两步

1关于中间视图自转

2周围小视图旋转

1、中间视图自转

主要采取两部,首先将Image加载到imageView上,然后iamgeView加载到中间的视图上

将中间视图使用3D的trasform中的m34进行倾斜75度,然后imageView做自转

实现:先看每个矩阵里数字代表的含义:

struct CATransform3D

{

CGFloat m11(x缩放), m12(y切变), m13(旋转), m14()

CGFloat m21(x切变), m22(y缩放), m23(), m24()

CGFloat m31(旋转), m32(), m33(), m34(透视效果)

CGFloat m41(x平移), m42(y平移), m43(z平移), m44()

}

我们所需要的正是 m34 。

CATransform3D rotate = CATransform3DMakeRotation(-75*M_PI/180.0f, 1, 0, 0)      CGFloatdisZ =270

CATransform3D scale = CATransform3DIdentity

scale.m34=1.0f/disZ

 CATransform3Dtransform =CATransform3DConcat(rotate, scale)

_bgView.layer.transform= transform

备注:_bgView(就是旋转图片的父视图)

关于ImageView的自转:

_iconImageView.transform = CGAffineTransformMakeRotation(count*SPEED *M_PI/180)

备注:count*SPEED *M_PI/180为旋转角度,主要是用NSTImer每0.01秒调用一次,计算角度

2周围小视图旋转

创建多个小视图,同理在NSTimer每0.01秒调用一次

static int count =0

    ++count

    for(inti =0i <6i++) {

      UIButton* button = (UIButton*)[selfviewWithTag:100+ i]

        CGFloatangle =150+60* i + count *SPEED

        doublesinAngle =sin(angle *M_PI/180)

        doublecosAngle =cos(angle *M_PI/180)

        CGFloatcenterX =SCREEN_SIZE.width/2+ cosAngle *RADIUS

        CGFloatcenterY =SCREEN_SIZE.height/2+ sinAngle *RADIUS*scaleValue

        button.center=CGPointMake(centerX, centerY)                     button.transform=CGAffineTransformMakeScale(0.7+sinAngle*0.3,0.7+sinAngle*0.3)

    }

以上就为我实现的思路,如果有问题请联系我邮箱:578145120@qq.com

实现以上图片旋转堆叠效果:

var orderImg =UIImageView()

            foriin0..<5{

                letimg =  UIImageView()

                if(i==0) {

                    orderImg = img

                    aboveView.addSubview(orderImg)

                }else{

                    aboveView.insertSubview(img, belowSubview: orderImg)

                    orderImg = img

                }

                letaboveViewWidth =UIScreen.main.bounds.width*0.5

                letimgWidth =calculate(w:200.0)

                letimgHeight =calculate(wh:282.0, pwh:200.0, cpwh:imgWidth)

                letimgX = (aboveViewWidth-imgWidth)*0.5

                letimgY =calculate(h:70.0)

                img.frame=CGRect(x: imgX, y:imgY, width: imgWidth, height: imgHeight)

                img.image=UIImage(named:"select_small_photo")

                img.alpha=1-0.1*CGFloat(i)

                //自身的旋转点

                img.layer.anchorPoint=CGPoint(x:0.5, y:1.0)

                //相对于父控件的旋转点(img的父控件为aboveView)

                img.layer.position=CGPoint(x: imgX+imgWidth*0.5, y: imgY+imgHeight)

                //设置图片的旋转角度

                letangle = (CGFloat.pi/18.0)*CGFloat(i)

                img.transform=CGAffineTransform(rotationAngle: angle)

            }

1、用frame,不要用Masonry或snap布局

2、anchorPoint和position两个属性必须要设置,否则显示的坐标有问题


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11279940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存