热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOSCALayer的transform属性(QuartzCore框架)和view的transform属性(CoreGraphics框架)

CoreGraphics是Quartz2D的一个高级绘图引擎,常用与iOS,tvOS,macOS的图形绘制应用开发。CoreGraphic

Core Graphics是Quartz 2D的一个高级绘图引擎,常用与iOS,tvOS,macOS的图形绘制应用开发。Core Graphics是对底层C语言的一个简单封装,其中提供大量的低层次,轻量级的2D渲染API。是基于CPU的框架,openGL、Metal都是基于GPU。

quartz是一个通用的术语,用于描述在iOSMAC OS X 中整个媒体层用到的多种技术 包括图形、动画、音频、适配。Quart 2D 是一组二维绘图和渲染API,Core Graphic会使用到这组API,Quartz Core专指Core Animation用到的动画相关的库、API和类。CoreGraphics 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。

ios图像处理模块的经典原理配图如下:

 

 

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,weak) CALayer * redLayer;

@end

 

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //手工创建

    CALayer * redLayer = [CALayerlayer];

    

    //设置背景颜色

    redLayer.backgroundColor = [UIColorredColor].CGColor;

    

    //位置和大小

    redLayer.position =CGPointMake(100,100);

    

    redLayer.bounds =CGRectMake(0,0, 100,100);

    

    [self.view.layeraddSublayer:redLayer];

    

    self.redLayer = redLayer;

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    //旋转

//   方法一&#xff1a; self.redLayer.transform &#61; CATransform3DRotate(self.redLayer.transform, M_PI_4, 1, 1, 0);

    

//   方法二&#xff1a; self.redLayer.transform &#61; CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

    

    //KVC

//   方法三&#xff1a; NSValue * value &#61; [NSValue valueWithCATransform3D:CATransform3DRotate(self.redLayer.transform, M_PI_4, 100, 0, 0)];//&#xff08;这个是quartzCore框架中的&#xff09;

//    //    [self.redLayer setValue:value forKeyPath:&#64;"transform"];

 

  // 方法四&#xff1a;

    [self.redLayersetValue:&#64;(M_PI_4)forKeyPath:&#64;"transform.rotation.x"];

    

    //方法五&#xff1a;

    self.view.transform&#61;CGAffineTransformMakeRotation(M_PI_2);//旋转M_PI_2

        self.view.transform&#61;CGAffineTransformRotate(self.view.transform,M_PI_2);//在上次旋转的基础上&#xff0c;再旋转

}

- (void) test02

{

    //缩放

    //方法一&#xff1a;   self.redLayer.transform &#61; CATransform3DScale(self.redLayer.transform, 1, 1, 0.5);

    // 方法二&#xff1a;  self.redLayer.transform &#61; CATransform3DMakeScale(0.5, 0.5, 1);&#xff08;调用的是quartzCore框架中的方法&#xff09;

    

    //KVC

    //   方法三&#xff1a; NSValue * value &#61; [NSValue valueWithCATransform3D:CATransform3DScale(self.redLayer.transform, 0.5, 0.5, 1)];

        [self.redLayer setValue:value forKeyPath:&#64;"transform"];

    //方法四&#xff1a;

    [self.redLayersetValue:&#64;0.5forKeyPath:&#64;"transform.scale.x"];

    //方法五&#xff1a;

//    self.view.transform&#61;CGAffineTransformMakeScale(3, 3);//宽高都放大3倍&#xff08;这是coreGraphics中的框架&#xff0c;如果是view.transform就要调用coreGraphics这个框架里面的方法&#xff0c;如果layer.transform就要调用quartzCore中的方法&#xff09;

        self.view.transform&#61;CGAffineTransformScale(self.view.transform,2, 3);//在上次缩放的基础上&#xff0c;再缩放

}

- (void) test01

{

    //平移

    //方法一&#xff1a;    self.redLayer.transform &#61; CATransform3DTranslate(self.redLayer.transform, 50, 0, 0);

    

    //  方法二&#xff1a;  self.redLayer.transform &#61; CATransform3DMakeTranslation(50, 50, 0);

    

    //KVC

    

    //  方法三&#xff1a;  NSValue * value &#61; [NSValue valueWithCATransform3D:CATransform3DTranslate(self.redLayer.transform, 50, 50, 0)];

        [self.redLayer setValue:value forKeyPath:&#64;"transform"];

    

    // 方法四&#xff1a;   [self.redLayer setValue:&#64;50 forKeyPath:&#64;"transform.translation.y"];

    //方法五&#xff1a;

//    self.view.transform&#61;CGAffineTransformMakeTranslation(20, 30);//x轴平移20&#xff0c;y轴平移30

    self.view.transform&#61;CGAffineTransformTranslate(self.view.transform,20, 30);//在上次平移的基础上&#xff0c;再平移

}

 

&#64;end

 

平移 &#xff1a;①根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
②根据本身的transform后者另外的transform进行平移CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)缩放 &#xff1a;①根据本身的transform进行缩放
CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
②根据本身的transform后者另外的transform进行缩放
CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)旋转 &#xff1a;① 根据本身的transform进行旋转
CGAffineTransformMakeRotation(CGFloat angle) &#xff08;angle 旋转的角度&#xff09;
②根据本身的transform后者另外的transform进行旋转
CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)恢复 &#xff1a;反向旋转
CGAffineTransformInvert(CGAffineTransform t)合并&#xff1a;CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
两个transform合并起来

两个view的transform的计算&#xff1a;https://www.jianshu.com/p/e1fec2f92c63


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 解决C++编译错误C3867的方法
    本文详细介绍了在不同版本的Visual Studio中,如何正确处理成员函数指针以避免编译错误C3867。同时,提供了一个具体的代码示例及其优化方案。 ... [详细]
  • GIMP 2.99.2 发布:UI 采用 GTK3 实现、原生支持高分屏和 Wayland
    开源项目评选最后一周,手里的5票再不用就没用了https:www.oschina.netprojecttop_cn_2020GIMP2.99.2已发布,同时这也标志着GIMP3.0的到来,其中最显著的变化是从GTK2过渡到GTK3工具包。基于 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
author-avatar
苏黎世的风景
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有