如何通过代码将UIView置于UILabel后方?(CollectionView自定义分段控件场景)
解决UIView置于UILabel后方的问题
嘿,我看你正在基于CollectionView做自定义分段控件,想要把背景视图放在标签的后方对吧?从你的代码来看,问题出在视图层级的设置上——你现在用了insertSubview(backgroundView, aboveSubview: nameLabel),这会把backgroundView放到nameLabel的上层,反而会遮挡住标签,这肯定不是你想要的效果。
要实现背景视图在标签后方,有两种简单的方式:
方式一:调整子视图添加顺序
UIView的子视图是按添加顺序堆叠的,后添加的子视图会显示在更上层。所以你可以先添加backgroundView,再添加nameLabel,这样nameLabel自然就会在backgroundView的上方:
// 先创建并添加背景视图 let backgroundView = UIView() backgroundView.backgroundColor = .white backgroundView.translatesAutoresizingMaskIntoConstraints = false addSubview(backgroundView) // 再创建并添加标签(假设你已初始化label内容) let nameLabel = UILabel() nameLabel.translatesAutoresizingMaskIntoConstraints = false addSubview(nameLabel) // 激活所有约束 NSLayoutConstraint.activate([ // 标签的约束 nameLabel.topAnchor.constraint(equalTo: topAnchor), nameLabel.leadingAnchor.constraint(equalTo: leadingAnchor), nameLabel.bottomAnchor.constraint(equalTo: bottomAnchor), nameLabel.trailingAnchor.constraint(equalTo: trailingAnchor), // 背景视图的约束 backgroundView.leadingAnchor.constraint(equalTo: nameLabel.leadingAnchor), backgroundView.bottomAnchor.constraint(equalTo: nameLabel.bottomAnchor), backgroundView.widthAnchor.constraint(equalTo: nameLabel.widthAnchor, multiplier: 1), backgroundView.heightAnchor.constraint(equalToConstant: 48) ])
方式二:使用insertSubview指定层级
如果你已经先添加了nameLabel,也可以用insertSubview(_:belowSubview:)方法,把backgroundView插入到nameLabel的下方:
// 先添加标签并设置约束 nameLabel.translatesAutoresizingMaskIntoConstraints = false addSubview(nameLabel) NSLayoutConstraint.activate([ nameLabel.topAnchor.constraint(equalTo: topAnchor), nameLabel.leadingAnchor.constraint(equalTo: leadingAnchor), nameLabel.bottomAnchor.constraint(equalTo: bottomAnchor), nameLabel.trailingAnchor.constraint(equalTo: trailingAnchor) ]) // 创建背景视图并插入到标签下方 let backgroundView = UIView() backgroundView.backgroundColor = .white backgroundView.translatesAutoresizingMaskIntoConstraints = false // 关键:用belowSubview替代aboveSubview insertSubview(backgroundView, belowSubview: nameLabel) // 激活背景视图的约束 NSLayoutConstraint.activate([ backgroundView.leadingAnchor.constraint(equalTo: nameLabel.leadingAnchor), backgroundView.bottomAnchor.constraint(equalTo: nameLabel.bottomAnchor), backgroundView.widthAnchor.constraint(equalTo: nameLabel.widthAnchor, multiplier: 1), backgroundView.heightAnchor.constraint(equalToConstant: 48) ])
这两种方式都能让backgroundView乖乖待在nameLabel的后方,不会遮挡标签内容。你可以根据自己的代码结构选择其中一种就行~
内容的提问来源于stack exchange,提问作者Ferry Adi Wijayanto
相关产品推荐
相关产品推荐

