一:CATransform3D

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} /**
* 1:要想产生3D动画,则必须操作layear图层,self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);其中M_PI为180度,后面三个参数xyz轴,z轴指向自己,其中绕着哪个轴旋转传参数1就可以了,其余两个轴上的点坐标为0,如上,就会绕着空间(1,1)点的向量旋转。
2:KVC:1:kvc的作用就是给某个对象的属性赋值,下划线的成员变量也可以,属性的属性也可以,就用setValue forKeyPath,也可以将对象取出来,valueForkeyPath 2:通过kvc也可以快速做旋转,平移,缩放:
[self.imageV.layer setValue:@(100) forKeyPath:@"transform.translation.x"]; 3:transform等结构体变量,封装为对象就用NSValue, NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)];
*
*/
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //3D效果
[UIView animateWithDuration:0.5 animations:^{ //self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0); //把结构体转成对象
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, , , )]; //通过KVC一般是做快速旋转,平移,缩放
[self.imageV.layer setValue:@() forKeyPath:@"transform.translation.x"]; }]; } @end

坐标系如图

layer的 CATransform3D属性.

只有旋转的时候才可以看出3D的效果.

旋转

x,y,z 分别代表x,y,z轴.

CATransform3DMakeRotation(M_PI, 1, 0, 0);

平移

CATransform3DMakeTranslation(x,y,z)

缩放

CATransform3DMakeScale(x,y,z);

可以通过KVC的方式进行设置属性.

但是CATransform3DMakeRotation它的值,是一个结构体, 所以要把结构转成对象.

NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];

[_imageView.layer setValue:value forKeyPath:@"transform.scale"];

什么时候用KVC?

当需要做一些快速缩放,平移,二维的旋转时用KVC.

比如: [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];

快速的进行缩放.

后面forKeyPath属性值不是乱写的.苹果文档当中给了相关的属性.

二:CALayear 和UIView的区别:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad]; //1:自定义layaer,对象方法alloc 或是类方法,color要转换为CGColor,image要转化为CGImage
CALayer *layer = [CALayer layer];
layer.backgroundColor = [UIColor redColor].CGColor;
layer.frame = CGRectMake(, , , );
[self.view.layer addSublayer:layer]; //2:在图层上添加图片
/**
* 图层上添加图片:图层layear的contents是固定放图片的,所以,往图层上添加图片要添加在layear的contents上,并且要转换为CGImage
*
*/
layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage; } @end

1.如何自定义Layer.

自定义CALayer的方式创建UIView的方式非常相似.

CALayer *layer = [CALayer layer];

layer.frame = CGRectMake(50, 50, 100, 100);

layer.backgroundColor = [UIColor redColor].CGColor;

[self.view.layer addSublayer:layer];

给layer设置图片.

layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage;

2.关于CALayer的疑惑?

为什么要使用CGImageRef、CGColorRef?

为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

UIView和CALayer都能够显示东西,该怎样选择?

对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以

如果显示出来的东西需要跟用户进行交互的话,用UIView;

如果不需要跟用户进行交互,用UIView或者CALayer都可以

CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

三:CALayear的两个重要属性:position 和 anchorPoint

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIView *orangeView;

/** <#注释#> */
@property (nonatomic, weak) CALayer *layer;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // CALayer *layer = [CALayer layer];
// layer.frame = CGRectMake(200, 200, 100, 100);
// layer.backgroundColor = [UIColor redColor].CGColor;
//
// self.layer = layer;
// [self.view.layer addSublayer:layer]; //UIView的center,就是它内部layer的position.
NSLog(@"center = %@",NSStringFromCGPoint(self.orangeView.center));
NSLog(@"position = %@",NSStringFromCGPoint(self.orangeView.layer.position)); } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// self.layer.position = CGPointMake(200, 200); NSLog(@"center = %@",NSStringFromCGPoint(self.orangeView.center));
NSLog(@"position = %@",NSStringFromCGPoint(self.orangeView.layer.position)); self.orangeView.layer.anchorPoint = CGPointMake(0.5, ); }

记住两个重要的结论:1:UIView的center,就是它内部layer的position.UIView的center 和 图层layear的potison是一样的,修改任意一个,另一个都会同样改变(前提是anchorPoint点是默认的0.5 ,0.5)   2:先定义好图层layear的position,在定义好锚点anchorPoint,然后锚点就会平移到position点,两点重合。

position和anchorPoint是CAlayer的两个属性.

我们以前修改一个控件的位置都是能过Frame的方式进行修改.

现在利用CALayer的position和anchorPoint属性也能够修改控件的位置.

这两个属性是配合使用的.

position:它是用来设置当前的layer在父控件当中的位置的.

所以它的坐标原点.以父控件的左上角为(0.0)点.

anchorPoint:它是决点CALayer身上哪一个点会在position属性所指的位置

anchorPoint它是以当前的layer左上角为原点(0.0)

它的取值范围是0~1,它的默认在中间也就是(0.5,0.5)的位置.

anchorPoint又称锚点.就是把锚点定到position所指的位置.

两者结合使用.想要修改某个控件的位置,我们可以设置它的position点.

设置完毕后.layer身上的anchorPoint会自动定到position所在的位置.

ios开发图层layer与核心动画二:CATransform3D,CAlayear和UIView区别,layer的position和anchorpoint的更多相关文章

  1. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇—Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  2. iOS开发-UI 从入门到精通(二)

    iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...

  3. IOS第18天(9,核心动画-动画组)

    ****动画组 // 核心动画都是假象,不能改变layer的真实属性的值// 展示的位置和实际的位置不同.实际位置永远在最开始位置 #import "HMViewController.h&q ...

  4. IOS第18天(1,核心动画layer, 旋转,缩放,平移,边框,剪裁,圆角)

    ****动画效果 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [UIView animateWithDurat ...

  5. iOS开发——图层OC篇&UIColor深入研究(CGColor,CIColor)

    UIColor深入研究(CGColor,CIColor) 由于跟人比较喜欢研究关于图层与动画方面的技术,正打算看看别人写的好东西,就遇到了好几个问题, 第一:UIClor类方法的使用 就是关于UICo ...

  6. [iOS UI进阶 - 6.1] 核心动画CoreAnimation

    A.基本知识 1.概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对 ...

  7. iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏

    1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...

  8. 【Swift】IOS开发中自定义转场动画

    在IOS开发中,我们model另外一个控制器的时候,一般都使用默认的转场动画. 其实我们可以自定义一些转场动画.达到不同的转场效果. 步骤如下:(photoBrowser是目标控制器) 1.在源控制器 ...

  9. iOS UI进阶-3.0 核心动画

    Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<Quar ...

随机推荐

  1. 自定义控件学习——仿qq侧滑栏

    效果 主要步骤: 1. 在xml布局里摆放内容. include    2. 在自定义ViewGroup里, 进行measure测量, layout布局    3. 响应用户的触摸事件    4. i ...

  2. 72.挖掘CSDN密码到链表并统计密码出现次数生成密码库

    list.h #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include & ...

  3. log4j.properties配置与加载应用

    log4j.properties总结:   一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器 ...

  4. 用py2exe打包成一个exe文件

    用py2exe打包成一个exe文件 http://blog.csdn.net/franktan2010/article/details/46514607

  5. 洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes

    P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而7777 ...

  6. android:一个Open键引发的问题!!

    1.问题简单介绍 首先描写叙述一下问题.当我们安装完APP的时候,界面会显示两个button,一个完毕键,一个Open键,点击Open键之后.进入应用.此时.我们点击HOME键.程序将会后台.然后再点 ...

  7. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

  8. 【Codeforces Round #447 (Div. 2) A】QAQ

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] C语言程序练习题 [代码] #include <bits/stdc++.h> using namespace std; ...

  9. 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】

    [199-Binary Tree Right Side View(从右边看二叉树] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 代码下载[https://github.co ...

  10. poj 3122

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10309   Accepted: 3651   Special Ju ...