【问题标题】:zPosition and subviews arrayzPosition 和子视图数组
【发布时间】: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 个视图不同的地方。


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

【问题讨论】:

    标签: ios iphone objective-c uiview calayer


    【解决方案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];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多