zoukankan      html  css  js  c++  java
  • [iOS]学习笔记5(CATransform3DCube)

    1. CATransform3D结构成员的意义。

    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();
    }; 
    

    ps:整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若s<0,发生关于原点的对称等比变换。

    ()空的地方以后补充。

    2. CATransform3DMakeTranslation

    CATransform3DMakeTranslation(0, 0, 0) 创建了一个4*4的单位矩阵。

    3. CATransform3DMakeRotation And CATransform3DRotate

    CATransform3DMakeRotation()

        _transformedLayer = [CALayer layer];
        _transformedLayer.frame = self.bounds;
        _transformedLayer.anchorPoint = CGPointMake(0.5f, 0.5f);
        CATransform3D sublayerTransform = CATransform3DIdentity;
        // Set perspective
        sublayerTransform.m34 = kPerspective;
        [_transformedLayer setSublayerTransform:sublayerTransform];
        
        [self.layer addSublayer:_transformedLayer];
        //init Sublayers
        CATransform3D t = CATransform3DMakeTranslation(0, 0, 0);
        // take snapshot of the current view
        [_transformedLayer addSublayer:[self snapshot:t 
                                             withView:_contentView 
                                             isMasked:YES]];
        // 暂时先支持一个方向翻转
        RotateDirection direction = RotateFromBottom;
        if (YES || direction == RotateFromBottom)
        {
            CGFloat height = self.bounds.size.height;
            //CGFloat cubeSize = 100.0f;
            t = CATransform3DRotate(t, D2R(90.0), 1, 0, 0);【1】
            t = CATransform3DTranslate(t, 0, height, 0);
            CALayer *subLayer = [self snapshot:t withView:view isMasked:YES];
            [_transformedLayer addSublayer:subLayer];
        }
        else 
        {
        }
        
        _newContentView = view;
        
        [self animationCubeRotate:direction withDuration:duration];
    

      

    4. 翻转的动画

    - (void)animationCubeRotate:(RotateDirection)direction 
                   withDuration:(float)duration
    {
        [CATransaction flush];
        CGFloat height = self.bounds.size.height;
        CABasicAnimation *rotation;
        // CABasicAnimation *translationX;	// 如果沿X轴翻转,则用不到这个变量.
        CABasicAnimation *translationY;	// 如果沿Y轴翻转,则用不到这个变量.
        CABasicAnimation *translationZ;
        CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
        animationGroup.delegate = self;
        animationGroup.duration = duration;
        
        if ( direction == RotateFromBottom )
        {
            // 创建(某方向)关键帧动画.
            translationY = [CABasicAnimation animationWithKeyPath:
                            @"sublayerTransform.translation.y"];
            translationY.toValue = [NSNumber numberWithFloat:-(height / 2)];【2】
            rotation = [CABasicAnimation animationWithKeyPath:
                        @"sublayerTransform.rotation.x"];
            rotation.toValue = [NSNumber numberWithFloat:D2R(-90.0f)];
        } 
        else if ( direction == RotateFromTop )
        {
        }
        
        // 处理Z轴
        translationZ = [CABasicAnimation animationWithKeyPath:
                        @"sublayerTransform.translation.z"];
        translationZ.toValue = [NSNumber numberWithFloat:height / 2];【3】
        animationGroup.animations = 
        	[NSArray arrayWithObjects: rotation, translationY, translationZ, nil];
        animationGroup.fillMode = kCAFillModeForwards;
        animationGroup.removedOnCompletion = NO;
        [_transformedLayer addAnimation:animationGroup forKey:kAnimationKey];
    }
    

    made, 我发现这个东西确实很难讲清楚,主要是因为我理论薄弱,

    【1】针对X轴旋转,就是1,0,0,针对Y轴旋转,就是0,1,0...下面那行也要进行正确的转换。

    【2】此处应该是和 anchorPoint有关系的。

    【3】这个值会影响类似于深度的东西,比如说Cube会离我们更近,或者是更远。(但是,似乎不算是透视关系)

  • 相关阅读:
    iOS 怎么在一个函数执行完毕得到某个参数值后再去执行他下边的代码
    微信小程序开发(三)-----手动创建目录结构
    微信小程序开发(二)-----项目的创建
    微信小程序开发(一)-----工具的安装
    Block传值讲解与使用
    Mybatis xml约束文件的使用
    Spark Streaming 整合 Kafka
    Scala 大数据 常用算法收集
    WPF自定义动画控件 风机
    wpf 错误 执行了 QueryInterface 调用,请求提供 COM 可见的托管类“BoilerMonitoringV1._0.MapControl”的默认 IDispatch 接口。
  • 原文地址:https://www.cnblogs.com/healerkx/p/2317579.html
Copyright © 2011-2022 走看看