zPosition和subviews数组

时间:2014-01-10 20:05:27

标签: ios iphone objective-c uiview calayer

我有以下问题:我想要有常量,定义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的两个子视图:view1view2,它们具有相同的大小和框架。 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在不同的地方创建视图。


所以最后问题是:有没有办法解决问题,在开头描述?

2 个答案:

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