初窥 CGAffineTransform 文档解读

初窥 CGAffineTransform  文档解读

  • 序言
    其实 CGAffineTransform 是一个结构体

    struct CGAffineTransform {
    CGFloat a, b, c, d;
    CGFloat tx, ty;
    };


博主小手一抖, 初始化成这样:’CGAffineTransform *transform = CGAffineTransformIdentity;’这样Xcode是会报错的,然后查验方法却总是找不到错误,自已一查,妹的!竟然是初始化的时候数据类型有错误。)
**下面步入正题**

CGAffineTransform

  • The identity transform: [ 1 0 0 1 0 0 ].
  • 返回单位矩阵

    CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);    
    

CGAffineTransformMake

  • Return the transform [ a b c d tx ty ].
  • 返回矩阵

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

CGAffineTransformMakeTranslation

  • Return a transform which translates by ‘(tx, ty)’:
    t = [ 1 0 0 1 tx ty ].
  • 直接将数值转换成仿射变换

    CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
    CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
    

CGAffineTransformMakeScale

  • **Return a transform which scales by ‘(sx, sy)’:
    t = [ sx 0 0 sy 0 0 ].**
  • 仿射变换的放缩效果

    CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);    
    

CGAffineTransformMakeRotation

  • **Return a transform which rotates by ‘angle’ radians:
    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);    
    

CGAffineTransformIsIdentity

  • Return true if ‘t’ is the identity transform, false otherwise.
  • 判断是否是单位矩阵

    CG_EXTERN bool CGAffineTransformIsIdentity(CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
    

CGAffineTransformTranslate

  • **Translate ‘t’ by ‘(tx, ty)’ and return the result:
    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);    
    

CGAffineTransformScale

  • **Scale ‘t’ by ‘(sx, sy)’ and return the result:
    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);    
    

CGAffineTransformRotate

  • **Rotate ‘t’ by ‘angle’ radians and return the result:
    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);    
    

CGAffineTransformInvert

  • **Invert ‘t’ and return the result. If ‘t’ has zero determinant, then ‘t’
    is returned unchanged.**
  • 得到一个逆矩阵

    CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);    
    

CGAffineTransformConcat

  • **Concatenate ‘t2’ to ‘t1’ and return the result:
    t = t1 * t2.**
  • 合并矢量

    CG_EXTERN CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1,
    CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);    
    

CGAffineTransformEqualToTransform

  • Return true if ‘t1’ and ‘t2’ are equal, false otherwise.
    判断俩仿射变换是否相等

    CG_EXTERN bool CGAffineTransformEqualToTransform(CGAffineTransform t1,
    CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);    
    

CGPointApplyAffineTransform

  • **Transform ‘point’ by ‘t’ and return the result:
    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);
    

CGSizeApplyAffineTransform

  • **Transform ‘size’ by ‘t’ and return the result:
    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);
    

CGRectApplyAffineTransform

  • **Transform ‘rect’ by ‘t’ and return the result. Since affine transforms do
    not preserve rectangles in general, this function returns the smallest
    rectangle which contains the transformed corner points of ‘rect’. If ‘t’
    consists solely of scales, flips and translations, then the returned
    rectangle coincides with the rectangle constructed from the four
    transformed corners.**

    CG_EXTERN CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t)
    CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个功能可以通过以下步骤实现: 1. 在图片上添加一个长按手势识别器,当用户长按图片时触发该手势识别器。 2. 在手势识别器的回调方法中,创建一个 UIMenuController,并设置其代理为当前视图控制器。 3. 在代理方法中,根据菜单项的标题执行相应的操作,比如旋转图片。可以使用 CGAffineTransformMakeRotation 函数来实现图片的旋转。 4. 在菜单项执行完操作后,需要将 UIMenuController 隐藏起来,以免影响用户体验。 下面是实现代码的示例: ```swift // 添加长按手势识别器 let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:))) imageView.addGestureRecognizer(longPressRecognizer) // 长按手势识别器的回调方法 @objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) { if recognizer.state == .began { // 创建菜单控制器 let menuController = UIMenuController.shared menuController.setTargetRect(imageView.frame, in: view) menuController.arrowDirection = .default menuController.setMenuVisible(true, animated: true) menuController.menuItems = [ UIMenuItem(title: "图片重置", action: #selector(resetImage)), UIMenuItem(title: "图片向右旋转30度", action: #selector(rotateImage30)), UIMenuItem(title: "图片向右旋转90度", action: #selector(rotateImage90)), UIMenuItem(title: "图片向右旋转180度", action: #selector(rotateImage180)) ] menuController.update() } } // 菜单控制器的代理方法 override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if action == #selector(resetImage) || action == #selector(rotateImage30) || action == #selector(rotateImage90) || action == #selector(rotateImage180) { return true } else { return false } } override func validate(_ menuItem: UIMenuItem) -> Bool { return true } override func didTap(_ menuItem: UIMenuItem) { // 执行菜单项对应的操作 if menuItem.action == #selector(resetImage) { imageView.transform = .identity } else if menuItem.action == #selector(rotateImage30) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 6) } else if menuItem.action == #selector(rotateImage90) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) } else if menuItem.action == #selector(rotateImage180) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } // 隐藏菜单控制器 UIMenuController.shared.setMenuVisible(false, animated: true) } // 菜单项对应的操作方法 @objc func resetImage() { imageView.transform = .identity } @objc func rotateImage30() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 6) } @objc func rotateImage90() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) } @objc func rotateImage180() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值