Ios Z位置和子视图数组
我有以下问题:我想要常数,定义Ios Z位置和子视图数组,ios,iphone,objective-c,uiview,calayer,Ios,Iphone,Objective C,Uiview,Calayer,我有以下问题:我想要常数,定义parentView.subviewsarray中子视图的顺序。这些常量不必是子视图数组的索引,但它们可以 大概是这样的: #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.subviews
array中子视图的顺序。这些常量不必是子视图数组的索引,但它们可以
大概是这样的:
#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
,它们具有相同的大小和帧<代码>父视图。子视图数组是{view1,view2}
(按此顺序)。
如果我这样做
子视图的显示顺序会改变,但点击处理顺序和父视图。子视图数组保持不变,因此我在顶部看到view1
,点击它,但此点击由view2
处理,这不是我所期望的
所以我需要同时更改显示顺序和事件处理顺序
我的最佳想法是使用代码,它总是将新的zPosition与更改子视图数组的代码一起设置:
view2.layer.zPosition = 0;
NSUInteger* index = [parentView.subviews indexOfObject:view2];
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index];
但这似乎不是最好的解决方案
另一个想法是使用
[parentView insertSubview:atIndex://code>而不是[parentView addSubview]
,但我需要确保以正确的顺序插入视图,这有点烦人,因为我在不同的位置创建了大约15个视图
最后一个问题是:有没有一种方法可以解决这个问题,如开头所述?如何根据所需的堆叠顺序分配子视图的标记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];
}
如果使用zPosition,它只会移动图层(视觉部分),但一切都会正常工作,就像什么都没有改变一样。尝试使用以下方法:
[self.view sendSubviewToBack:view1];
或
[self.view sendSubviewToBack:view1];
[self.view bringSubviewToFront:view2];