zPosition 和子视图数组

Posted

技术标签:

【中文标题】zPosition 和子视图数组【英文标题】:zPosition and subviews array 【发布时间】:2014-01-10 20:05:26 【问题描述】:

我有以下问题:我想要常量,在parentView.subviews 数组中定义子视图的顺序。这个常量不必是子视图数组的索引,但它们可以。

类似这样的:

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

比subviews的显示顺序改变了,但是tap处理顺序和parentView.subviews数组保持不变,所以我在顶部看到view1,点击它,但是这个tap是由view2处理的,不是我的期望。

所以我需要同时更改显示顺序和事件处理顺序。

我最好的想法是使用代码,它始终与代码一起设置新的 zPosition,从而更改子视图数组:

view2.layer.zPosition = 0;
NSUInteger* index = [parentView.subviews indexOfObject:view2];
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index];

但这似乎不是最好的解决方案。


其他想法是使用[parentView insertSubview:atIndex:] 而不是[parentView addSubview],但是我需要确保我以正确的顺序插入视图,这有点令人厌烦,因为我在其中创建了大约 15 个视图不同的地方。


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

【问题讨论】:

【参考方案1】:

如何根据所需的堆叠顺序分配子视图的标签 1..15(如果有 15 个)。将它们全部放在一个数组中,然后按标签排序。迭代数组,将它们添加到父视图中。

我不确定它们是如何创建的,但假设它们以任意顺序包含在某个数组中:

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

将它们添加到超级视图中,现在已排序:

for (UIView *view in views) 
    [theViewThatContainsThemInTagOrder addSubview:view];

【讨论】:

【参考方案2】:

如果您使用 zPosition,它只会移动图层(视觉部分),但一切都会正常工作,就像没有任何改变一样。尝试使用这个:

[self.view sendSubviewToBack:view1];

[self.view bringSubviewToFront:view2];

【讨论】:

以上是关于zPosition 和子视图数组的主要内容,如果未能解决你的问题,请参考以下文章

无法选择我已添加到屏幕的暂停按钮

如何在 iOS 中将堆栈视图中的第一个视图置于最前面? [复制]

父组件和子组件之间交换数据

zPosition 的 SpriteKit 问题

为啥有时滚动视图和子视图大小不一致

旋转视图和子视图