【问题标题】:Is there a way of setting some kind of z-index for z-position of UIImageView objects?有没有办法为 UIImageView 对象的 z 位置设置某种 z 索引?
【发布时间】:2009-05-05 17:35:30
【问题描述】:

我正在构建一个图像网格,我从顶部开始,在各处创建 UIImageView 对象。现在我希望它们重叠一点,但我画的最后一个是最上面的。我想以编程方式设置 z 位置,以便我绘制的第一个将是最上面的。

【问题讨论】:

    标签: iphone cocoa-touch uikit uiview


    【解决方案1】:

    您可以尝试使用 insertSubiew,而不是:

    - (void)bringSubviewToFront:(UIView *)view
    - (void)sendSubviewToBack:(UIView *)view
    

    【讨论】:

    • 这种技术适用于您以编程方式添加图像(或其他视图)并且希望将其推到后台的情况。在我的例子中,我在 Interface Builder 中设置了一些标签,但我在代码中添加了一个可拉伸的背景图像。如果不使用 sendSubviewToBack:,背景图像会出现在标签的顶部。
    【解决方案2】:

    你说你使用了 UIImageView。使用 UIImageView 绘制图像意味着对其进行初始化,然后将其添加到容器视图中。

    你不能在你的循环中使用这个代码吗?

    [containerView insertSubview:image atIndex:[[containerView subviews] count]]
    

    结果将是首先添加的视图位于视图堆栈的顶部(虽然我还无法对此进行测试:))

    【讨论】:

    • 如果所有的索引都相同会怎样?
    • 好吧,他们不能,因为例如添加一个 att 索引 0,会撞倒堆栈中的所有其他人。
    【解决方案3】:

    https://stackoverflow.com/a/4631895/2482283

    您可以使用视图层(它是一个 CALayer 对象)的 zPosition 属性来更改视图的 z-index。

    theView.layer.zPosition = 1;
    

    正如 Viktor Nordling 所补充的,“大值是最重要的。你可以使用任何你想要的值,包括负值。”默认值为 0。

    您需要导入 QuartzCore 框架才能访问该层。只需在实现文件的顶部添加这行代码即可。

    #import "QuartzCore/QuartzCore.h"
    

    另一种方式(https://stackoverflow.com/a/4663526/2482283),你也可以使用uiviews方法:

    @property(nonatomic,readonly) UIView *superview;
    @property(nonatomic,readonly,copy) NSArray *subviews;
    
    - (void)removeFromSuperview;
    - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
    - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;
    
    - (void)addSubview:(UIView *)view;
    - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
    - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
    
    - (void)bringSubviewToFront:(UIView *)view;
    - (void)sendSubviewToBack:(UIView *)view;
    

    【讨论】:

      【解决方案4】:

      不直接。

      一种解决方案是给 UIViews 一个 z-index 属性;定义深度级别的整数。然后您可以遍历包含 UIViews 的 NSArray (myArray),将它们按深度顺序添加为子视图。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。我需要具有最高和最低 z-index 的子视图元素。从我的测试中我发现,UIKit 根据它们的 z 位置排列子视图属性中的元素。如果你拿 [self.scrollview subviews] 例如。第一个数组元素是位于最后面的子视图。索引最高的数组元素是最前面的子视图。如果你使用

        - (void)bringSubviewToFront:(UIView *)view
        - (void)sendSubviewToBack:(UIView *)view`
        

        子视图数组将相应地重新排序。

        【讨论】:

          【解决方案6】:

          如果你有下面/上面视图的引用,你需要添加子视图,你可以使用以下

          [self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
          [self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];
          

          【讨论】:

            【解决方案7】:

            实际上,据我所知,没有 z-index 位置属性。在视图中绘图使用简单的绘图模型。

            您可以将您的逻辑放在绘图循环中(即最后在顶部绘制您想要的东西),或者您可以使用 Cocoa Animation,因为与 UIImageView 不同,CALayers 确实有深度(它们是 3D 空间的 2D 投影) .参考here

            【讨论】:

            • 是的,我认为每个 UIImageView 都是基于 CALayer 的?
            • 是的,想想看,在 iPhone 中,所有视图都是有图层支持的。稍微挖掘一下,我在 UIImageView 文档中找到了以下方法: – insertSubview:aboveSubview: – insertSubview:belowSubview:
            【解决方案8】:
            imageView.layer.zPosition = 100;
            

            【讨论】:

              【解决方案9】:

              您可能真的想考虑使用 CALayer 来代替大量的 UIImageView 对象。 UIImageView 对象很棒,但对于密集绘图,CALayer 的重量更轻且效率更高(尽管如果您需要让用户与图像交互,视图对象会更好)。这真的取决于你在做什么。 CALayers 确实有一个 zPosition 属性。这是 UIKit 在排列 UIView 在视图堆栈中的位置时使用的。

              【讨论】:

                猜你喜欢
                • 2013-09-15
                • 1970-01-01
                • 1970-01-01
                • 2023-03-15
                • 2021-12-09
                • 2013-07-03
                • 2016-04-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多