如何在 Objective-C 中设置显示顺序

Posted

技术标签:

【中文标题】如何在 Objective-C 中设置显示顺序【英文标题】:How to set order of display in Objective-C 【发布时间】:2009-06-08 07:23:29 【问题描述】:

我正在尝试使用 CGContext 路径绘制命令在 UIImageView 绘制和线条绘制之间混合,但绘制顺序不正确。 我需要在图像顶部绘制路径,但反过来。

我实现它的方式:

    在 UIImageView 中设置 UIImage 并将 UIImageView 添加为主视图的子视图。 接下来我使用“drawRect”(刷新绘制函数)通过​​ UIKit CGContextStrokePath 函数绘制路径。

现在,除了直接使用 Context 图像绘制功能(我想避免这种情况,因为我通过几个 UIImageView 重复使用我的图像资源),有没有办法正确设置顺序(可能是一个标志集)?

问题再次是线条/路径在 UIImageViews 之前绘制(通过与父 UIView 的连接自动绘制),因此它们在图像/UIImageViews 上不可见。

谢谢

【问题讨论】:

【参考方案1】:

您可以尝试通过 Quartz Core 使用层来实现这一点(请参阅 CALayer 类文档)。基本上,您可以有层层次​​结构。您将每个 UIView 关联到不同的层,然后将这些层一起呈现,以提供单个复合层。此外,您还可以对图层应用变换和动画。

您需要导入 QuartzCore 标头并执行类似的操作

#import <QuartzCore/QuartzCore.h>
UIView *mainView = [[UIView alloc] initWithFrame...
UIImageView *imageView = ...

CaLayer *mainViewLayer = mainView.layer;
[mainViewLayer addSubLayer: imageView.layer];

然后,当 mainView 出现在屏幕上时,所有的 sublayers 被合并在一起并呈现在屏幕上。发生的情况是每个视图呈现其层,而 mainViewLayer 被呈现合并两个层。

让我知道这是否适合你。

您可以拥有任意数量的层。您可以使用 CALayer 方法创建任意层次结构

– addSublayer: 
– removeFromSuperlayer
– insertSublayer:atIndex:
– insertSublayer:below:
– insertSublayer:above:
– replaceSublayer:with:

【讨论】:

【参考方案2】:

最顶层(在本例中为最后添加的)子视图的内容将出现在所有其他视图的前面。如果您添加图像子视图并绘制到其父视图中,则该图像将出现在您在该父视图中所做的任何绘制之前。

您应该在添加 UIImageView 后才能绘制到添加到主视图的新视图。

如果需要,您还可以使用 bringSubviewToFront:sendSubviewToBack: 手动重新排列视图。

(从您的帖子中,尚不清楚您正在绘制哪个视图,但我假设您正在绘制可以解释此行为的主要父视图。)

【讨论】:

感谢您的订单(ToFront/ToBack)。我仍然坚持在 UIImageView 之前绘制线条/路径的事实,因此在它们的位置不可见

以上是关于如何在 Objective-C 中设置显示顺序的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中设置一个新的 Parse 服务器

Plcsim 模拟IO访问故障 OB122组织块

在 Silverlight DataGrid 中设置初始排序顺序?

如何在phpexcel中设置自动高度(自动换行)?

IOS/Objective-C:在呈现视图控制器中设置属性

在 Swift 的 Objective-C++ 类中设置变量 --> 意外的 nil 崩溃