热门标签 | 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


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 技嘉秀高端B450主板:不再支持第七代APU,性价比高且兼容锐龙一代和二代
    在台北电脑展上,技嘉展示了一款高端的B450主板,型号为“b450 aorus pro wi-fi”。该主板具有10+1相供电、散热片覆盖的供电区域和芯片组,以及两个m.2插槽和背部IO挡板。虽然不支持第七代APU bristol ridge,但它兼容锐龙一代和二代,且具有较高的性价比。该主板还配备了音频声卡、Wi-Fi无线网卡等功能,是一款性能出色且设计精良的主板。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
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社区 版权所有