zoukankan      html  css  js  c++  java
  • iOS之CGAffineTransform属性详解和方法使用

    1、CGAffineTransform简介

      UIView有个属性transform,是CGAffineTransform类型。可以使其在二维界面做旋转、平移、缩放单独或者组合动画!

    CGAffineTransform是个结构体:

    //平移 tx:控制x轴平移, ty:控制y轴平移
    //缩放 a:控制x轴缩放, d:控制y轴缩放
    //旋转 abcd共同控制
    struct CGAffineTransform {
        CGFloat a, b, c, d;
        CGFloat tx, ty;
    };

    2、CGAffineTransform的简单使用和代码展示

      2.1、平移

                CGAffineTransform transform = CGAffineTransformIdentity;
                transform =CGAffineTransformTranslate(transform, 100, 100);
                [UIView animateWithDuration:1
                                 animations:^{
                                     self.showView.transform = transform;
                                 }
                                 completion:^(BOOL finished) {
                                     self.showView.transform = CGAffineTransformIdentity;
                                 }];

    效果图

     2.2、旋转

                CGAffineTransform transform = CGAffineTransformIdentity;
                transform = CGAffineTransformRotate(transform, M_PI_4);
                [UIView animateWithDuration:1
                                 animations:^{
                                     self.showView.transform = transform;
                                 }
                                 completion:^(BOOL finished) {
                                     self.showView.transform = CGAffineTransformIdentity;
                                 }];

    效果图

     

      2.3、反转

                CGAffineTransform transform = CGAffineTransformIdentity;
                transform = CGAffineTransformRotate(transform, M_PI_4);
                [UIView animateWithDuration:1
                                 animations:^{
                                     self.showView.transform = CGAffineTransformInvert(transform);
                                 }
                                 completion:^(BOOL finished) {
                                     self.showView.transform = CGAffineTransformIdentity;
                                 }];

    效果图

      2.4、缩放

                CGAffineTransform transform = CGAffineTransformIdentity;
                transform =CGAffineTransformScale(transform, .5, .5);
                [UIView animateWithDuration:1
                                 animations:^{
                                     self.showView.transform = transform;
                                 }
                                 completion:^(BOOL finished) {
                                     self.showView.transform = CGAffineTransformIdentity;
                                 }];

    效果图

    //初始化
    self.showView.transform = CGAffineTransformIdentity;
    self.showView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
    
    //平移
    self.showView.transform = CGAffineTransformMakeTranslation(100, 100);
    self.showView.transform = CGAffineTransformMake(1, 0, 0, 1, 100, 100);
        
    //缩放
    self.showView.transform = CGAffineTransformMakeScale(.5, .5);
    self.showView.transform = CGAffineTransformMake(.5, 0, 0, .5, 0, 0);
        
    //旋转
    self.showView.transform = CGAffineTransformMakeRotation(M_PI_4);
    self.showView.transform = CGAffineTransformMake(cos(M_PI_4), sin(M_PI_4), -sin(M_PI_4), cos(M_PI_4), 0, 0);

    3、CGAffineTransform相关属性和方法

    #ifndef CGAFFINETRANSFORM_H_
    #define CGAFFINETRANSFORM_H_
    
    typedef struct CGAffineTransform CGAffineTransform;
    
    #include <CoreGraphics/CGBase.h>
    #include <CoreGraphics/CGGeometry.h>
    
    CF_IMPLICIT_BRIDGING_ENABLED
    
    //结构
    //平移 tx:控制x轴平移, ty:控制y轴平移
    //缩放 a:控制x轴缩放, d:控制y轴缩放
    //旋转 abcd共同控制
    struct CGAffineTransform {
        CGFloat a, b, c, d;
        CGFloat tx, ty;
    };
    
    /* The identity transform: [ 1 0 0 1 0 0 ]. 常量(还原)和原图一样的transform*/
    CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* Return the transform [ a b c d tx ty ]. 创建transform*/
    CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
                                                      CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 创建平移的transform: t' = [ 1 0 0 1 tx ty ]  */
    CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
                                                                 CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 创建缩放的transform: t' = [ sx 0 0 sy 0 0 ] */
    CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 创建旋转的(顺时针)transform: t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */
    CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 查看是否是默认的transform */
    CG_EXTERN bool CGAffineTransformIsIdentity(CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
    
    /* 根据已有的transform基础上进行平移: t' = [ 1 0 0 1 tx ty ] * t */
    CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,
                                                           CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 根据已有的transform基础上进行缩放: t' = [ sx 0 0 sy 0 0 ] * t */
    CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t,
                                                       CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 根据已有的transform基础上进行旋转: t' =  [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */
    CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
                                                        CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 反向旋转 */
    CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 合并两个transform :t' = t1 * t2 */
    CG_EXTERN CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1,
                                                        CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 判读两个transform是否相等 */
    CG_EXTERN bool CGAffineTransformEqualToTransform(CGAffineTransform t1,
                                                     CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
    
    /* 得到新的中心:
     p' = p * t
     where p = [ x y 1 ]. */
    CG_EXTERN CGPoint CGPointApplyAffineTransform(CGPoint point,
                                                  CGAffineTransform t) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 得到新的size:
     s' = s * t
     where s = [ width height 0 ]. */
    CG_EXTERN CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    
    /* 得到新的rect */
    CG_EXTERN CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
    
    /*** Definitions of inline functions. 内联函数定义***/
    CG_INLINE CGAffineTransform
    __CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d,
                            CGFloat tx, CGFloat ty)
    {
        CGAffineTransform t;
        t.a = a; t.b = b; t.c = c; t.d = d; t.tx = tx; t.ty = ty;
        return t;
    }
    #define CGAffineTransformMake __CGAffineTransformMake
    
    CG_INLINE CGPoint
    __CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)
    {
        CGPoint p;
        p.x = (CGFloat)((double)t.a * point.x + (double)t.c * point.y + t.tx);
        p.y = (CGFloat)((double)t.b * point.x + (double)t.d * point.y + t.ty);
        return p;
    }
    #define CGPointApplyAffineTransform __CGPointApplyAffineTransform
    
    CG_INLINE CGSize
    __CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t)
    {
        CGSize s;
        s.width = (CGFloat)((double)t.a * size.width + (double)t.c * size.height);
        s.height = (CGFloat)((double)t.b * size.width + (double)t.d * size.height);
        return s;
    }
    #define CGSizeApplyAffineTransform __CGSizeApplyAffineTransform
    
    CF_IMPLICIT_BRIDGING_DISABLED
    
    #endif /* CGAFFINETRANSFORM_H_ */
  • 相关阅读:
    别闹了,这些都不是数字化转型
    对不起,“下一代ERP”仍旧是现在的ERP
    这世界真小
    SAP S4HANA 2020 Fully-Activated Appliance 虚拟机版分享
    花费巨资参加SAP培训真的有用吗?
    剑指 Offer 07. 重建二叉树
    剑指 Offer 06. 从尾到头打印链表
    剑指 Offer 05. 替换空格
    剑指 Offer 04.二维数组中的查找
    剑指 Offer 03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/xianfeng-zhang/p/7724042.html
Copyright © 2011-2022 走看看