简单理解iOS中CGAffineTransform和CATransform3D

简单理解iOS中CGAffineTransform和CATransform3D

 CGAffineTransform:2d平面的变换

 CATransform3D:3D空间中的变换

关于仿射变换的理解可以参考https://www.cnblogs.com/shine-lee/p/10950963.html

class TestViewController: UIViewController{
    
    var disposeBag = DisposeBag()
    var animateCube : UIView!
    var tansform = CATransform3DIdentity
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        initView()
        
    }
    func initView(){
        let frame  = CGRect(x: 0, y: 0,  200, height: 200)
        animateCube = UIView(frame: frame)
        animateCube.center = view.center
        view.addSubview(animateCube)
        
        let test = UIView(frame: frame)
        test.backgroundColor = UIColor.blue.withAlphaComponent(0.25)//最外边平面
        test.layer.transform = CATransform3DTranslate(test.layer.transform, 0, 0, 100)
        
        let test1 = UIView(frame: frame)
        test1.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        test1.layer.transform = CATransform3DTranslate(test1.layer.transform, 0, 0, -100)//沿Z轴平移-100,最里边的平面
        
        let test2 = UIView(frame: frame)
        test2.backgroundColor = UIColor.yellow.withAlphaComponent(0.5)//左边平面
        test2.layer.transform = CATransform3DTranslate(test2.layer.transform, -100, 0, 0)//3d平移(沿X轴平移-100)
        test2.layer.transform = CATransform3DRotate(test2.layer.transform, CGFloat.pi/2, 0, 1, 0)//3d旋转(沿Y轴旋转90度)
        
        let test3 = UIView(frame: frame)
        test3.backgroundColor = UIColor.purple.withAlphaComponent(0.5)//右边平面
        test3.layer.transform = CATransform3DTranslate(test3.layer.transform, 100, 0, 0)//沿X轴平移100
        test3.layer.transform = CATransform3DRotate(test3.layer.transform, CGFloat.pi/2, 0, 1, 0)//沿着Y轴旋转90度
        
        let test4 = UIView(frame: frame)
        test4.backgroundColor = UIColor.orange.withAlphaComponent(0.5)//上边平面
        test4.layer.transform = CATransform3DTranslate(test4.layer.transform, 0, 100, 0)//沿y轴平移100
        test4.layer.transform = CATransform3DRotate(test4.layer.transform, CGFloat.pi/2, 1, 0, 0)//沿着X轴旋转90度
        
        let test5 = UIView(frame: frame)
        test5.backgroundColor = UIColor.green.withAlphaComponent(0.5)//下边平面
        test5.layer.transform = CATransform3DTranslate(test5.layer.transform, 0, -100, 0)//沿y轴平移-100
        test5.layer.transform = CATransform3DRotate(test5.layer.transform, CGFloat.pi/2, -1, 0, 0)//沿着X轴旋转90度
        
        animateCube.addSubview(test)
        animateCube.addSubview(test1)
        animateCube.addSubview(test2)
        animateCube.addSubview(test3)
        animateCube.addSubview(test4)
        animateCube.addSubview(test5)
        
        self.animateCube.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)//2d变换
        
        self.tansform.m34 = 1.0 / -500//透视效果,远小近大,深入屏幕里边小
        
        
        self.animateCube.layer.sublayerTransform = self.tansform;//
        
        //定时器旋转
        let timer = Observable<Int>.timer(1,period:1/60,scheduler: MainScheduler.instance)
        /// 添加订阅
        timer.subscribe { (event) in
            self.tansform = CATransform3DRotate(self.tansform, CGFloat.pi/360, -0.3, -1,0.7)
            self.animateCube.layer.sublayerTransform = self.tansform;//
        }.disposed(by: disposeBag)
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       
    }
}

  参考链接:https://www.jianshu.com/p/3dd14cfbdc53

原文地址:https://www.cnblogs.com/duzhaoquan/p/12680554.html