我有以下问题:我想要常量,在 parentView.subviews
数组中定义 subview 的顺序。此常量不一定是 subview 数组的索引,但它们可以。
像这样:
#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
的 subview :view1
和 view2
,它们具有相同的大小和框架。 parentView.subviews
数组是 {view1, view2}
(按此顺序)。
如果我这样做
view2.layer.zPosition = VIEW2_INDEX;
view1.layer.zPosition = VIEW1_INDEX;
subview 的显示顺序改变了,但是点击处理顺序和 parentView.subviews
数组保持不变,所以我在顶部看到 view1
,点击它,但是此点击由 view2
处理,这不是我所期望的。
所以我需要同时更改显示顺序和事件处理顺序。
我最好的想法是使用代码,它总是与更改 subview 数组的代码一起设置新的 zPosition:
view2.layer.zPosition = 0;
NSUInteger* index = [parentView.subviews indexOfObject:view2];
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index];
但这似乎不是最好的解决方案。
其他想法是使用 [parentView insertSubview:atIndex:]
而不是 [parentView addSubview]
,但我需要确保插入 View 按照正确的顺序,这有点烦人,因为我在不同的地方创建了大约 15 个 View 。
所以最后的问题是:有没有办法解决开头描述的问题?
最佳答案
如何根据所需的堆叠顺序分配 subview 的标签 1..15(如果有 15 个)。将它们全部放在一个数组中,然后按标签排序。迭代数组,将它们添加到父 View 。
我不确定它们是如何创建的,但假设它们以任意顺序包含在某个数组中:
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;
}];
将它们添加到父 View ,现在已排序:
for (UIView *view in views) {
[theViewThatContainsThemInTagOrder addSubview:view];
}
关于ios - zPosition 和 subview 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21053465/