博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS CALayer的transform属性(QuartzCore框架)和view的transform属性(CoreGraphics框架)
阅读量:4289 次
发布时间:2019-05-27

本文共 3686 字,大约阅读时间需要 12 分钟。

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

quartz是一个通用的术语,用于描述在iOSMAC OS X 中整个媒体层用到的多种技术 包括图形、动画、音频、适配。Quart 2D 是一组二维绘图和渲染APICore Graphic会使用到这组APIQuartz 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

{

    //旋转

//   方法一: self.redLayer.transform = CATransform3DRotate(self.redLayer.transform, M_PI_4, 1, 1, 0);

    

//   方法二: self.redLayer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

    

    //KVC

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

//    //    [self.redLayer setValue:value forKeyPath:@"transform"];

 

  // 方法四:

    [self.redLayersetValue:@(M_PI_4)forKeyPath:@"transform.rotation.x"];

    

    //方法五:

    self.view.transform=CGAffineTransformMakeRotation(M_PI_2);//旋转M_PI_2

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

}

- (void) test02

{

    //缩放

    //方法一:   self.redLayer.transform = CATransform3DScale(self.redLayer.transform, 1, 1, 0.5);

    // 方法二:  self.redLayer.transform = CATransform3DMakeScale(0.5, 0.5, 1);(调用的是quartzCore框架中的方法)

    

    //KVC

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

        [self.redLayer setValue:value forKeyPath:@"transform"];

    //方法四:

    [self.redLayersetValue:@0.5forKeyPath:@"transform.scale.x"];

    //方法五:

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

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

}

- (void) test01

{

    //平移

    //方法一:    self.redLayer.transform = CATransform3DTranslate(self.redLayer.transform, 50, 0, 0);

    

    //  方法二:  self.redLayer.transform = CATransform3DMakeTranslation(50, 50, 0);

    

    //KVC

    

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

        [self.redLayer setValue:value forKeyPath:@"transform"];

    

    // 方法四:   [self.redLayer setValue:@50 forKeyPath:@"transform.translation.y"];

    //方法五:

//    self.view.transform=CGAffineTransformMakeTranslation(20, 30);//x轴平移20,y轴平移30

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

}

 

@end

 

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

两个view的transform的计算:

转载地址:http://selgi.baihongyu.com/

你可能感兴趣的文章
消息队列 mq 必会面试题
查看>>
线程池的工作原理是啥?能手写一个线程池吗?
查看>>
一口气说出 6种 延时队列的实现方案,大厂offer稳稳的
查看>>
原来redis这么简单,跟着文章操作一遍你就会了
查看>>
Redis两种持久化机制RDB和AOF详解(面试常问,工作常用)
查看>>
事务隔离级别中的可重复读能防幻读吗?
查看>>
老伙计,关于JDK并发包,这些不为人知的秘密你知道多少?
查看>>
图片的左右切换
查看>>
进级的RecyclerView——LRecyclerView
查看>>
Android 利用Gradle实现app的环境分离
查看>>
Android系统篇之----Binder机制和远程服务调用
查看>>
JavaScript DOM 属性
查看>>
Gradle 实现 Android 多渠道定制化打包
查看>>
Android开源项目及库整理总结
查看>>
Android快速开发系列 10个常用工具类
查看>>
深入理解JSON对象
查看>>
类似新浪微博帖子显示话题、@好友、表情解析等
查看>>
JSP 自动刷新
查看>>
Java应用架构的演化之路
查看>>
看透内存中的数组
查看>>