Swift技术问题:如何消除嵌套在半透明View中按钮的继承透明度?
解决父视图半透明导致子按钮继承透明度的问题
嘿,我来帮你搞定这个问题~你现在遇到的核心问题是:视图的层级顺序和透明度继承是完全独立的两件事,bringSubview(toFront:)只能调整视图的绘制先后,根本改不了子视图继承父视图透明度的规则——当你给bottomView设置alpha = 0.65时,它的所有子视图都会被强制带上这个透明度,哪怕把按钮放到最顶层也没用。
下面给你两个靠谱的解决方案,选适合你的就行:
方案一:用背景色的alpha替代视图本身的alpha(推荐)
这是最简单的处理方式,不要直接设置bottomView.alpha,而是给它的背景色添加透明度。这样父视图的背景是半透明的,但子视图不会继承任何透明度,按钮就能保持完全清晰。
把你原来设置bottomView.alpha = 0.65的代码,替换成下面的写法:
func settingView(){ // 给bottomView的背景色设置透明度,而不是视图本身的alpha if let originalBgColor = bottomView.backgroundColor { bottomView.backgroundColor = originalBgColor.withAlphaComponent(0.65) } bottomView.isOpaque = false // 必须关闭不透明属性,否则背景色的alpha不会生效 // 这时候按钮不需要调整层级,默认就是清晰的 }
方案二:调整视图层级,让按钮和bottomView同级
如果你的需求是bottomView整体(包括它的所有子视图)都要半透明,但唯独这个按钮要完全清晰,那可以把按钮从bottomView里移出来,放到它的父视图(也就是你的superViewOutlet)中,让按钮和bottomView成为同级视图。
代码可以这么写:
func settingView(){ // 先把按钮从bottomView的子视图中移除 findVejOutlet.removeFromSuperview() // 把按钮添加到superViewOutlet里,和bottomView同级 superViewOutlet.addSubview(findVejOutlet) // 注意:这里需要重新设置按钮的frame或者约束,确保它的位置和之前在bottomView里一样 // 比如如果用自动布局,要重新添加约束;如果用frame,就设置对应的frame值 // 最后把按钮放到bottomView的前面,保证按钮能被看到 superViewOutlet.bringSubview(toFront: findVejOutlet) // 现在给bottomView设置alpha,按钮完全不受影响 bottomView.alpha = 0.65 }
内容的提问来源于stack exchange,提问作者Martin Utzon
相关产品推荐
相关产品推荐

