详解ios calayer 详解和 UIView 的区别和联系

您当前的位置 :&&&&&&
达内ios培训专家干货分享:iOS 面试大全
 编辑:张静怡
  很多面临求职就业的学生都会在面试过程中遇到各种问题,尤其是技术问题经常在紧张的气氛下让初次面试的同学无所适从,因此,达内ios培训()专家就总结了最为普遍的ios面试技术问题,希望对同学们有所帮助。
  1.UIWindow和UIView和CALayer的联系和区别?
  答:UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上响应触摸事件的对象;
  UIwindow是UIView的子类,UIWindow的主要作用:一是提供一个区域来显示UIView,二是将事件(event)的分发给UIView,一个应用基本上只有一个UIWindow.
  万物归根,UIView和CALayer都是的老祖都是NSObjet。可见UIResponder是用来响应事件的,也就是UIView可以响应用户事件。
  CALayer和UIView的区别:
  1.1 UIView的继承结构为: UIResponder : NSObject。
  CALayer的继承结构为: NSObject。可见UIResponder是用来响应事件的,也就是UIView可以响应用户事件,CALayer直接从NSObject继承,因为缺少了UIResponder类,不能响应任何用户事件。
  1.2所属框架,UIView是在/System/Library/Frameworks/UIKit.framework中定义的,UIKit主要是用来构建用户界面,并且是可以响应事件的。CALayer是在/System/Library/Frameworks/QuartzCore.framework定义的。而且CALayer作为一个低级的,可以承载绘制内容的底层对象出现在该框架中。
  1.3 UIView相比CALayer最大区别是UIView可以响应用户事件,而CALayer不可以。UIView侧重于对显示内容的管理,CALayer侧重于对内容的绘制。UIView是基于CALayer的高层封装。
  1.4相似支持1:相似的树形结构2:显示内容绘制方式3:布局约束
  总结一下就是:UIView是用来显示内容的,可以处理用户事件.CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件
  为啥有两套体系并不是两套体系?UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性
  UIView的layer树形在系统内部,被系统维护着三份copy。
  第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
  第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
  第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。
  这三棵树的逻辑结构都是一样的,区别只有各自的属性。
  UIView的主layer以外,对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成。
  CALayer的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1,也就是按照比例来设置。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。
  2. property 都有哪些常见的字段
  strong,weak,retain,assign,copy nomatic,readonly
  3. strong,weak,retain,assign,copy nomatic等的区别。
  assign:简单赋值,不更改索引计数(Reference Counting)对基础数据类
  copy:建立一个索引计数为1的对象,然后释放旧对象。对NSString
  retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,对其他NSObject和其子类
  weak和strong的区别:weak和strong不同的是当一个对象不再有strong类型的指针指向它的时候它会被释放,即使还有weak型指针指向它。一旦最后一个strong型指针离去,这个对象将被释放,所有剩余的weak型指针都将被清除。
  copy与retain:
  copy其实是建立了一个相同的对象,而retain不是.
  copy是内容拷贝,retain是指针拷贝.
  copy是内容的拷贝,对于像NSString,的确是这样,如果拷贝的是NSArray这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".
  atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
  4.__block和__weak修饰符的区别:
  __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  __block对象可以在block中被重新赋值,__weak不可以。
  5.常见的Http状态码有哪些?
  http状态吗:302是请求重定向。500以上是服务器错误。400以上是请求链接错误或者找不到服务器。200以上是正确。100以上是请求接受成功。
  6.static 关键字的作用
  1.函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
  2.在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
  3.在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
  4.在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
  5.在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
北方网教育频道 新闻纠错、投诉及爆料热线:022-
·&·········
热点新闻排行榜
| 违法和不良信息举报电话:022- | 举报邮箱:jubao@ |
(C) 2000-.cn, Tianjin ENORTH NETNEWS Co.,LTD.All rights
本网站由天津北方网版权所有当瑜伽在女性世界里成为一种高端生活方式时,仍有许多男性对瑜伽怀有深深的偏见,因而无缘于这种向外解脱肉体、向内探求灵魂的修行方式。文|iSHOWi他们中的一些人对待瑜伽,或者望而却步,认为瑜伽是女性的专利,担心它的柔会蹉跎男人的阳气;或者嗤之以鼻,认为习练瑜伽的男人必定都是娘炮,没有阳刚之气。然而,我要告诉你一个事实:传统瑜伽就是为男人设计的!有瑜伽大师在书中曾提起过瑜伽体式的起源:传统印度瑜伽并不适合每一个人,只适合男人,因为在远古时代,瑜伽本来就是专为男人所设计的,尤其适合运动型的肌肉男。柔美之外,亦有阳刚你大概以为瑜伽都是柔美的,其实它和太极一样是刚柔并济的。瑜伽体式最重要的三个元素是平衡、力量、柔韧。较好的柔韧性会让你更容易完成一些体式,瑜伽也确实有锻炼柔韧性的效果,然而只有柔韧性对许多高阶体式来说并没有什么用,没有强大的力量和稳定的平衡性,根本无法形成蝎子式、孔雀式以及各种倒立体式。瑜伽本生就是一种平衡,只有力量与柔韧兼具,才能达到这种平衡。体式只是瑜伽修行的一部分如果把体式当作瑜伽的全部,那就太管中窥豹了。帕坦伽利在《瑜伽经》中提出了瑜伽的八分支,也就是瑜伽修习的八个步骤,分别是:制戒、内制、体式、呼吸控制、制感、专注、冥想、入定。你看,体式只是瑜伽修习的八个步骤之一而已。瑜伽体式练习,就像太极拳架练习一样,都是炼形,是通往最终精神修炼的初阶。所以你在瑜伽教室中常见的体式练习只是瑜伽修习的一部分,而呼吸法的练习和曼陀罗梵文吟唱,也是从身体觉知到精神修炼的一个途径。除此之外,瑜伽博大精深的哲学体系也是相当有趣的,那可比大学哲学受欢迎得多,不过大概只有大师工作坊和游学才有机会聆听。瑜伽大师以男性居多在印度,60%以上的练习者都是男性,瑜伽大师也以男性居多。艾扬格大师2004年还曾被《时代》周刊评选为“世界最具影响力100人”前阵子火爆网络的花臂大叔也是瑜伽高手练瑜伽的汉子通常都能收获身材姣好貌美如花的女朋友如今,瑜伽教室里的男人们越来越多了,真汉子已经开始练瑜伽了,假汉子才会心虚罢。来吧,汉子们,别害羞别犹豫,尽情释放你的男子气概吧!本文部分图片和文字来自网络,版权归原作者。如涉及侵权,请直接联系我们后台删除。谢谢!凡圣瑜伽凡圣皆由心所作凡圣瑜伽——专业瑜伽服饰长按下图指纹,识别图中二维码,一键关注凡圣瑜伽微信公众平台,了解瑜伽最新资讯。微信号:fashionyoga1 
 文章为作者独立观点,不代表微头条立场
的最新文章
双12年终盛典F05-902预售凡圣瑜伽八折预售凡圣瑜伽双十一活动攻略一年一度的抢购风暴即将来临双十一活动四大亮点1、双十一当天,三十余导读随着时代和潮流的发展,瑜伽已经不再是女性的专利,继越来越多的男子加入习练瑜伽的大军之后,少儿瑜伽也逐渐的大家都知道模特圈的淘汰速度是非常的快,过气的模特就像换季的衣服一样。很多都只是昙花一现,能够经得起时间的考验今天上午,胡静在微博晒出一组在林间做瑜伽的照片,网友大赞仙极了。照片中的胡静身穿白色宽松T恤和薄纱长裙裤,清瑜伽遇上万圣节开启万圣节瑜伽之约~要不是偶然看到米兰达·可儿的这组惊悚时尚照,小编差点就忘记万圣节马上就要到导读秋冬季节衣衫渐厚,但厚重衣服也挡不住的身材和曲线才是吸睛的线条美!别让塌臀和臃肿僵硬的背部线条毁了男神对怀有双胞胎是一种福气,三胞胎更是一种喜庆,四胞胎五胞胎六胞胎那简直就是中彩票了,好不热闹的场景。一起来看看这甩秋膘向运动进发夏天已经欢快的蹦跶走啦…减肥成功的妹纸们正穿着美美哒瑜伽服各种秀身材…还没减肥成功的妹纸们,用音乐歌颂瑜伽,跟随自己内心的声音
——Shivam Rath(悉瓦)↑没错,除了坚持运动之外,控制饮食对于减肥也非常重要。可你知道吗,减肥时“会吃”可能要比“少吃”更关键,如果甩秋膘向运动进发夏天已经欢快的蹦跶走啦…减肥成功的妹纸们正穿着美美哒瑜伽服各种秀身材…还没减肥成功的妹纸们,用音乐歌颂瑜伽,跟随自己内心的声音
——Shivam Rath(悉瓦)无论是曾经、现在、还是将来,我们始终都要有梦想。fashionyoga1fashionyoga凡圣瑜伽专业从事瑜伽运动服装用品设计、研发、制作、推广,致力于推广绿色、时尚、融合的瑜伽理念。其微信公众平台旨在与广大瑜伽爱好者交流瑜伽心得、品味瑜伽精髓、分享瑜伽欢乐。热门文章最新文章fashionyoga1fashionyoga凡圣瑜伽专业从事瑜伽运动服装用品设计、研发、制作、推广,致力于推广绿色、时尚、融合的瑜伽理念。其微信公众平台旨在与广大瑜伽爱好者交流瑜伽心得、品味瑜伽精髓、分享瑜伽欢乐。CALayer与UIView的关系
CALayer属于Core Animation部分的内容,比较重要而不太好理解。以下是园子中看到的一篇文章的摘录:
UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。
UIView有个重要属性layer,可以返回它的主CALayer实例。
// 要访问层,读取UIView实例的layer属性CALayer *layer = myView.layer
所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation
bars,Tables,Text
boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。
UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:
- (class)layerClass {
return ([CAEAGLLayer class]);
上述代码使得某个UIView的子类使用GL来进行绘制。
UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer:grayCover];
上述代码会在目标View上敷上一层黑色透明薄膜的效果。
UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。
动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
某layer.anchorPoint = CGPointMake(0.f,0.f);
如果这么设置,只会将layer的左上角被挪到原来的中间位置,必须加上这一句:
某layer.position = CGPointMake(0.f,0.f);
最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影&(shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影......
7.渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。
[gameLayer setNeedsDisplay];
若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:
[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];
如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core
Graphics的内容。用renderInContext:来做这个事。
[gameLayer renderInContext:UIGraphicsGetCurrentContext()];
8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。
characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);
CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform =
9.变形:Quartz
Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个根CALayer,在UIView上的所有视觉效果都是在这个Layer上进行的。
CALayer外形特征主要包括:
1、层的大小尺寸
3、内容(可以填充图片或者使用Core Graphics绘制的内容)
4、矩形是否使用圆角
5、矩形是否有阴影
Layer有很多种,最常用也是最基本的是CALayer,当然还包括其他的子类:
CAScrollerLayer 简化显示层的一部分
CATextLayer 文本层
CAGradientLayer、CAShapeLayer等等
使用层之前,需要在项目中引入QuartzCore.framework框架
为了区分背景UIView,我将UIView的背景色设置为白色,backLayer的背景色设置为橘黄色。
上图是一个矩形区域,如果设置矩形的四个角是椭圆角,可以添加属性:
backLayer.cornerRadius = 20.0; //矩形椭圆角的弧度半径
添加带阴影的子Layer(层),代码:
//添加子layer
CALayer *cyanLayer = [CALayer layer];
cyanLayer.backgroundColor = [UIColor cyanColor].CGC
cyanLayer.bounds = CGRectMake(0, 0, 300, 300);
cyanLayer.position = CGPointMake(180, 180);
cyanLayer.shadowOffset = CGSizeMake(0, 3); //设置阴影的偏移量
cyanLayer.shadowRadius = 10.0; //设置阴影的半径
cyanLayer.shadowColor = [UIColor blackColor].CGC
//设置阴影的颜色为黑色
cyanLayer.shadowOpacity = 0.9; //设置阴影的不透明度
[backLayer
addSublayer:cyanLayer];
给子Layer添加图片
//添加子image layer
UIImage *image = [UIImage imageNamed:@"feiche.jpg"];
CALayer *imageLayer = [CALayer layer];
imageLayer.frame = CGRectMake(100, 100, image.size.width,
image.size.height);
imageLayer.contents = (id) image.CGI
imageLayer.shadowOffset = CGSizeMake(0, 3); //设置阴影的偏移量
imageLayer.shadowRadius = 10.0; //设置阴影的半径
imageLayer.shadowColor = [UIColor blackColor].CGC
//设置阴影的颜色为黑色
imageLayer.shadowOpacity = 0.9; //设置阴影的不透明度
[backLayer
addSublayer:imageLayer];
图片加边框,代码:
imageLayer.borderColor = [UIColor grayColor].CGC
//边框颜色
imageLayer.borderWidth = 2.0; //边框宽度
设置图片为椭圆角,代码:
imageLayer.cornerRadius = 10.0; //设置layer圆角半径
imageLayer.masksToBounds = YES; //隐藏边界
但是由于设置masksToBounds
属性为true所以Layer的阴影效果也就没有了。
之前我都是将图片另外在做有阴影效果的图片,这样显的比较真实,如果阴影部分只是填充边框即可,可以采用两个Layer来实现阴影效果,代码:
UIImage *image = [UIImage imageNamed:@"feiche.jpg"];
//阴影layer
CALayer *shadowLayer = [CALayer layer];
shadowLayer.frame = CGRectMake(100, 100, image.size.width,
image.size.height);
shadowLayer.backgroundColor = [UIColor
blueColor].CGC
shadowLayer.shadowOffset = CGSizeMake(0, 3);
shadowLayer.cornerRadius = 10.0;
shadowLayer.shadowRadius = 10.0;
shadowLayer.shadowColor = [UIColor blackColor].CGC
//设置阴影的颜色为黑色
shadowLayer.shadowOpacity = 1.0; //设置阴影的不透明度
[backLayer addSublayer:shadowLayer];
//添加子image
CALayer *imageLayer = [CALayer layer];
imageLayer.frame = CGRectMake(100, 100, image.size.width,
image.size.height);
imageLayer.contents = (id) image.CGI
imageLayer.cornerRadius = 10.0; //设置layer圆角半径
imageLayer.masksToBounds = YES; //隐藏边界
imageLayer.borderColor = [UIColor grayColor].CGC
//边框颜色
imageLayer.borderWidth = 2.0;
[backLayer addSublayer:imageLayer];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 uiviewcontroller详解 的文章

 

随机推荐