【发布时间】:2009-05-05 17:35:30
【问题描述】:
我正在构建一个图像网格,我从顶部开始,在各处创建 UIImageView 对象。现在我希望它们重叠一点,但我画的最后一个是最上面的。我想以编程方式设置 z 位置,以便我绘制的第一个将是最上面的。
【问题讨论】:
标签: iphone cocoa-touch uikit uiview
我正在构建一个图像网格,我从顶部开始,在各处创建 UIImageView 对象。现在我希望它们重叠一点,但我画的最后一个是最上面的。我想以编程方式设置 z 位置,以便我绘制的第一个将是最上面的。
【问题讨论】:
标签: iphone cocoa-touch uikit uiview
您可以尝试使用 insertSubiew,而不是:
- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view
【讨论】:
你说你使用了 UIImageView。使用 UIImageView 绘制图像意味着对其进行初始化,然后将其添加到容器视图中。
你不能在你的循环中使用这个代码吗?
[containerView insertSubview:image atIndex:[[containerView subviews] count]]
结果将是首先添加的视图位于视图堆栈的顶部(虽然我还无法对此进行测试:))
【讨论】:
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;
【讨论】:
不直接。
一种解决方案是给 UIViews 一个 z-index 属性;定义深度级别的整数。然后您可以遍历包含 UIViews 的 NSArray (myArray),将它们按深度顺序添加为子视图。
【讨论】:
我遇到了同样的问题。我需要具有最高和最低 z-index 的子视图元素。从我的测试中我发现,UIKit 根据它们的 z 位置排列子视图属性中的元素。如果你拿
[self.scrollview subviews]
例如。第一个数组元素是位于最后面的子视图。索引最高的数组元素是最前面的子视图。如果你使用
- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view`
子视图数组将相应地重新排序。
【讨论】:
如果你有下面/上面视图的引用,你需要添加子视图,你可以使用以下
[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];
【讨论】:
实际上,据我所知,没有 z-index 位置属性。在视图中绘图使用简单的绘图模型。
您可以将您的逻辑放在绘图循环中(即最后在顶部绘制您想要的东西),或者您可以使用 Cocoa Animation,因为与 UIImageView 不同,CALayers 确实有深度(它们是 3D 空间的 2D 投影) .参考here。
【讨论】:
imageView.layer.zPosition = 100;
【讨论】:
您可能真的想考虑使用 CALayer 来代替大量的 UIImageView 对象。 UIImageView 对象很棒,但对于密集绘图,CALayer 的重量更轻且效率更高(尽管如果您需要让用户与图像交互,视图对象会更好)。这真的取决于你在做什么。 CALayers 确实有一个 zPosition 属性。这是 UIKit 在排列 UIView 在视图堆栈中的位置时使用的。
【讨论】: