将子视图置于前面
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来绘制呢?根本不需要,但可以帮助查明发生了什么以上是关于将子视图置于前面的主要内容,如果未能解决你的问题,请参考以下文章