我有以下问题:我想要有常量,定义parentView.subviews
数组中子视图的顺序。这个常量不一定是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
的两个子视图:view1
和view2
,它们具有相同的大小和框架。 parentView.subviews
数组为{view1, view2}
(按此顺序)。
如果我做
view2.layer.zPosition = VIEW2_INDEX;
view1.layer.zPosition = VIEW1_INDEX;
比子视图的显示顺序更改,但点击处理顺序和parentView.subviews
数组保持不变,因此我在顶部看到view1
,点击它,但此点击由{{1这不是我所期望的。
所以我需要同时更改显示顺序和事件处理顺序。
我最好的想法是使用代码,将新的zPosition与代码一起设置,改变子视图数组:
view2
但这似乎不是最佳解决方案。
其他想法是使用view2.layer.zPosition = 0;
NSUInteger* index = [parentView.subviews indexOfObject:view2];
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index];
而不是[parentView insertSubview:atIndex:]
,但我需要确保我按正确的顺序插入视图,这有点令人厌烦,因为我有大概15在不同的地方创建视图。
所以最后问题是:有没有办法解决问题,在开头描述?
答案 0 :(得分:1)
如何根据所需的堆叠顺序分配子视图的标签1..15(如果有15个)。将它们全部放在一个数组中,然后按标记排序。迭代数组,将它们添加到superview。
我不确定它们是如何创建的,但是假设它们以任意顺序包含在某个数组中:
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;
}];
将它们添加到superview,现已排序:
for (UIView *view in views) {
[theViewThatContainsThemInTagOrder addSubview:view];
}
答案 1 :(得分:1)
如果你使用zPosition它只会移动图层(可视部分),但是一切都会像没有改变一样工作。尝试使用:
[self.view sendSubviewToBack:view1];
或
[self.view bringSubviewToFront:view2];