Manipulating the Layer Hierarchy 操作layer结构

原文

Layers come with a full set of methods for reading and manipulating the layer hierarchy, parallel to the methods for reading and manipulating the view hierarchy. A layer has a superlayer property and a sublayers property, and these methods:
• addSublayer:
• insertSublayer:atIndex:
• insertSublayer:below:,insertSublayer:above: • replaceSublayer:with:
• removeFromSuperlayer
Unlike a view’s subviews property, a layer’s sublayers property is writable; thus, you can give a layer multiple sublayers in a single move, by assigning to its sublayers property. To remove all of a layer’s sublayers, set its sublayers property to nil.
Although a layer’s sublayers have an order, reflected in the sublayers order and regu‐ lated with the methods I’ve just mentioned, this is not necessarily the same as their back- to-front drawing order. By default, it is, but a layer also has a zPosition property, a CGFloat, and this also determines drawing order. The rule is that all sublayers with the same zPosition are drawn in the order they are listed among their sublayers siblings, but lower zPosition siblings are drawn before higher zPosition siblings. (The default zPosition is 0.)
Sometimes, the zPosition property is a more convenient way of dictating drawing order than sibling order is. For example, if layers represent playing cards laid out in a solitaire game, it will likely be a lot easier and more flexible to determine how the cards overlap by setting their zPosition than by rearranging their sibling order. Moreover, a subview’s layer is itself just a layer, so you can rearrange the drawing order of subviews by setting the zPosition of their underlying layers. In our code constructing Figure 3-5, if we assign the image view’s underlying layer a zPosition of 1, it is drawn in front of the red (left) rectangle:
[mainview addSubview:iv];
iv.layer.zPosition = 1;
Methods are also provided for converting between the coordinate systems of layers within the same layer hierarchy:
convertPoint:fromLayer:,convertPoint:toLayer:
convertRect:fromLayer:,convertRect:toLayer:

翻译

layers 伴随着一堆方法用来读取和操作layer的结构。和读取以及操作View的方法平行。一个layer有他的父layer和他所有的子layer的所有属性和方法。
addSublayer:

  • insertSublayer:atIndex:
  • insertSublayer:below:,insertSublayer:above:
  • replaceSublayer:with:
  • removeFromSuperlayer

不同于子View的属性,一个layer的子layer的属性是可写的。所以你可以给layer的多个子layer一些简单的操作通过分配子layer的属性。去清空所有子layer,设置子layer的属性为nil。

虽然一个layer的子layer有一个顺序,反映在子layer的顺序和我刚才提到的方法的调节。这不是必须和从后面到前面的绘制顺序一样。默认情况是这样的,但是一个layer同样有一个zPositon的属性,他是一个CGFloat类型,他同样确定了绘制的顺序。他的规则是具有相同zPosition属性的按照他们的兄弟视图列出的顺序绘制,但是比他们zPosition低的在高的视图前面。(他们的默认值是0)

有时候,zPosition属性是一个更加方便的方法相比兄弟排序。比如,如果想表现出打牌游戏摊开牌的情景,它将更加容易和灵活的确定牌应该怎么覆盖,通过设置他们的zPosition相对于重新设置他们的兄弟顺序。此外,一个子View的layer本身就是一个layer,所以你可以重新排列子view的绘制顺序通过设置他们的基本layer的zPosition。在我们的代码中如Figure 3-5,如果我们分配一个imageView 的基本zPosition为1,他将被画在前面。

UIImageView* iv =[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"boy"]];
    CGRect r = iv.frame;
    r.origin = CGPointMake(180,180);
    iv.frame = r;
    [self.view addSubview:iv];
    UIView * view = [[UIView alloc]initWithFrame:CGRectMake(170, 170, 90, 90)];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
    iv.layer.zPosition = 1;


  • convertPoint:fromLayer:
  • convertPoint:toLayer:
  • convertRect:fromLayer:
  • convertRect:toLayer:
    这四个方法试了,发现位置没有多大的变化。不知道具体该怎么用?

后在stackflow看到别人的回答

Every UIView has its own coordinates system. So if you have a UIView_1 that contains another UIView_2, they both have a point (10,10) within them.

  • 每一个UIView都有一个自己的坐标定位,所以如果你有一个UIView_1包含了另一个UIView_2,他们都有内部坐标(10,10)。
    convertPoint:toView: allows the developer to take a point in one view and convert the point to another view coordinate system.
  • 让开发者把当前视图的点移动到另一个视图的坐标系当中。
    Example: view1 contains view2. The top left corner of view2 is located at view1 point (10,10), or better to say view2.frame.orgin = {10,10}. That {10,10} is based in the view1 coordinate system. So far so good.
  • 例如:view1 包含了View2.View2左上角的坐标在View1的(10,10)坐标点上.
    The user touches the view2 at point {20,20} inside the view2. Now those coordinates are in the view2 coordinate system. You can now use covertPoint:toView: to convert {20,20} into the coordinate system of view1. touchPoint = {20,20}
  • 用户点击坐标点View2{20,20},现在他的坐标点在view2的坐标系中。你可以用covertPoint:toView。去改变作为View1坐标系中的{20,20}。
    CGPoint pointInView1Coords = [view2 convertPoint:touchPoint toView:view1];
    So now pointInView1Coords should be {30,30} in the view1 coordinate systems. Now that was just simple math on this example, but there are all sorts of things that contribute to the conversion. Transforms and scaling come to mind.
CGPoint pointInView1Coords = [view2 convertPoint:touchPoint toView:view1];
  • 所以pointInView1Coords的坐标在View1中变成了{30,30},现在这只是一个简单的数学例子,但是这是所有的转换。
    Read about UIView frame, bounds, and center. They are all related and they deal with coordinate systems for a view. Its confusing until you start doing stuff with them. Remember this frame and center are in the parent's coordinate system. Bounds is in the view's coordinate system.
    阅读关于UIView的frame,bounds,和Center。他们都关系到处理这个View的坐标。他使人困惑直到你开始使用他们。记住frame和Center 在他们父视图的坐标中。bounds体现在她自己的坐标系中。
    John

小结

** 看了之后才知道这不是用来改变View的而是用来计算坐标点距离的。果然code比文字能更好的说明问题。**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容