10

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

4

9 回答 9

21

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

- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view
于 2010-11-28T22:35:01.597 回答
14

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

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

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

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

于 2009-05-05T20:44:36.063 回答
7

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

您可以使用视图层的 zPosition 属性(它是一个 CALayer 对象)来更改视图的 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;
于 2014-02-18T10:50:39.390 回答
3

不是直接的。

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

于 2009-05-05T17:45:11.313 回答
3

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

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

subviews 数组将相应地重新排序。

于 2011-05-23T08:57:02.200 回答
3

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

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>];
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>];
于 2012-04-02T11:57:29.340 回答
2

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

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

于 2009-05-05T17:48:58.713 回答
2
imageView.layer.zPosition = 100;
于 2012-08-14T13:27:56.200 回答
1

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

于 2011-02-23T07:57:23.830 回答