zPosition 和子视图数组
Posted
技术标签:
【中文标题】zPosition 和子视图数组【英文标题】:zPosition and subviews array 【发布时间】:2014-01-10 20:05:26 【问题描述】:我有以下问题:我想要常量,在parentView.subviews
数组中定义子视图的顺序。这个常量不必是子视图数组的索引,但它们可以。
类似这样的:
#define VIEW1_INDEX 10 // or 0, if it's an index
#define VIEW2_INDEX 20 // or 1, if it's an index
这意味着parentView.subviews
数组是view1, view2
。
首先我尝试使用 CALayer 的 zPosition 属性。
假设我有 parentView
的两个子视图:view1
和 view2
,它们具有相同的大小和框架。 parentView.subviews
数组是 view1, view2
(按此顺序)。
如果我这样做了
view2.layer.zPosition = VIEW2_INDEX;
view1.layer.zPosition = VIEW1_INDEX;
比subviews的显示顺序改变了,但是tap处理顺序和parentView.subviews
数组保持不变,所以我在顶部看到view1
,点击它,但是这个tap是由view2
处理的,不是我的期望。
所以我需要同时更改显示顺序和事件处理顺序。
我最好的想法是使用代码,它始终与代码一起设置新的 zPosition,从而更改子视图数组:
view2.layer.zPosition = 0;
NSUInteger* index = [parentView.subviews indexOfObject:view2];
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index];
但这似乎不是最好的解决方案。
其他想法是使用[parentView insertSubview:atIndex:]
而不是[parentView addSubview]
,但是我需要确保我以正确的顺序插入视图,这有点令人厌烦,因为我在其中创建了大约 15 个视图不同的地方。
所以最后的问题是:有没有办法解决问题,如开头所述?
【问题讨论】:
【参考方案1】:如何根据所需的堆叠顺序分配子视图的标签 1..15(如果有 15 个)。将它们全部放在一个数组中,然后按标签排序。迭代数组,将它们添加到父视图中。
我不确定它们是如何创建的,但假设它们以任意顺序包含在某个数组中:
NSMutableArray *views = [NSMutableArray array];
UIView *subview9 = [[UIView alloc] init];
subview9.tag = 9;
[views addObject:subview9];
// and so on, in arbitrary order for subview1, subview2, subview3
// remember tag == 0 is no good, because it will be undistinguishable in viewWithTag
// from unassigned tags
对数组排序:
[views sortUsingComparator:^(UIView *vA, UIView *vB)
return vA.tag - vB.tag;
];
将它们添加到超级视图中,现在已排序:
for (UIView *view in views)
[theViewThatContainsThemInTagOrder addSubview:view];
【讨论】:
【参考方案2】:如果您使用 zPosition,它只会移动图层(视觉部分),但一切都会正常工作,就像没有任何改变一样。尝试使用这个:
[self.view sendSubviewToBack:view1];
或
[self.view bringSubviewToFront:view2];
【讨论】:
以上是关于zPosition 和子视图数组的主要内容,如果未能解决你的问题,请参考以下文章