将子视图置于前面

Posted

技术标签:

【中文标题】将子视图置于前面【英文标题】:Bring subview to front 【发布时间】:2016-09-02 06:27:07 【问题描述】:

我遇到了一个问题,我想将我添加到UICollectionViewCell 的徽章通知视图带到前面。我正在使用cell.layer.borderColor = [[UIColor redColor]CGColor]; UICollectionViewCell 添加边框。但是当添加边框时,它会出现在徽章视图的顶部。

添加边框后:

我在子类UICollectionViewCell 中使用[self addSubview:self.badge]; 将徽章视图添加到单元格中

我试过了,[self bringSubviewToFront:self.badge];self.badge.layer.zPosition = 1; 但没有帮助。我在 SO 上的类似帖子中找到了这些解决方案,但我认为我做错了什么。如果有人能指出这一点,我会很高兴。谢谢。

编辑 我根据建议做了一点改动,做了[self.contentView addSubview:self.badge];而不是[self addSubview:self.badge];。当我调试视图并检查所有视图层时,它确实在边框顶部显示了徽章,但在模拟器中并非如此。

【问题讨论】:

这是因为您将徽章添加到您正在应用边框的同一个视图中,只需添加另一个您应用边框的视图而不是在主视图中。 但是在这种情况下,bringSubviewToFront 应该仍然可以工作,对吧? 试试setcell.layer.borderWidth ,也许这对你的边框有帮助。 使用bringSubviewToFront ,您必须指向正确的视图。我认为在这种情况下,它应该是单元格的视图。 【参考方案1】:

正如@iphonic 所说,您无法使用相同的视图来绘制边框并包含徽章。

尝试设置这些视图层次结构:

Cell
   |- ContentView
      |- Main View (Apply border here)
         |- All you content
      |- Badge

【讨论】:

【参考方案2】:

您可以为您的自定义UICollectionViewCell 的边框创建一个特定的子视图,因此当您需要使其出现时,您可以轻松地将徽章放在前面。

以编程方式可能是这样的(在您的自定义 UICollectionViewCell 中)

UIView* border = [[UIView alloc] initWithFrame:cell.frame];
border.tag = 1001;
border.layer.borderColor = [[UIColor redColor]CGColor];
[self addSubview:border];

当您需要预先添加和显示徽章时

[self addSubview:self.badge];
[self bringSubviewToFront:[self viewWithTag:1001]];
[self bringSubviewToFront:self.badge]; 

【讨论】:

【参考方案3】:

为徽章使用单独的 CALayer。您似乎在同一层中同时绘制了徽章和边框,因此合并了两个图像。

【讨论】:

纯粹出于兴趣,将badgeView的backgroundColor设置为纯色会发生什么? 边框出现在徽章上,我不知道为什么会发生这种情况,因为在“查看调试”中,徽章明显超出了边框。 如果强行使用不同的CGContext来绘制呢?根本不需要,但可以帮助查明发生了什么

以上是关于将子视图置于前面的主要内容,如果未能解决你的问题,请参考以下文章

如何将子视图从其父视图的父视图置于顶部

如何在不改变其位置的情况下在界面生成器中将子视图置于前面

将子视图置于一切之上,但低于另一个 UIView

将先前添加的视图置于前面

无法将删除子视图置于前面

如何在 iOS 中将堆栈视图中的第一个视图置于最前面? [复制]