Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Z位置和子视图数组_Ios_Iphone_Objective C_Uiview_Calayer - Fatal编程技术网

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];