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