iOS 26.0+ 原生玻璃效果UIButton指定圆角设置失效的解决方案咨询
问题回顾:
在iOS <26.0版本中按钮圆角设置正常,但升级到iOS 26.0后,使用原生clearGlass()配置的UIButton无法正确应用指定的5pt圆角和仅顶部两个圆角的设置,每次都显示为全圆角。严格使用UIKit,不考虑UIVisualEffectView。原代码中尝试同时配置UIButton.Configuration和layer的圆角属性,但结果不符合预期。
问题定位
在iOS 26.0+中,使用UIButton.Configuration.clearGlass()创建的玻璃效果按钮,其背景样式由Configuration体系独立管理,和传统的layer圆角设置存在核心冲突:
- 直接设置
layer.cornerRadius、layer.maskedCorners会被Configuration的背景绘制逻辑覆盖,导致仅全圆角生效; - 原代码中同时混合使用两种机制,互相干扰后出现不符合预期的圆角效果;
- 玻璃效果的实现依赖layer不裁剪子视图,设置
layer.masksToBounds = true还会破坏毛玻璃的视觉表现。
解决方案(UIKit纯适配)
针对iOS 26.0+的玻璃效果按钮,我们需要完全通过UIButton.Configuration的原生API来设置圆角和指定圆角角落,放弃使用layer的相关属性;iOS <26.0版本继续保留原有的layer设置逻辑即可。
修改后的完整代码如下:
// 配置最大化按钮 if #available(iOS 26.0, *) { var config = UIButton.Configuration.clearGlass() // 配置全局圆角半径 config.background.cornerRadius = 5 // 仅指定顶部两个圆角(枚举值和layer.maskedCorners完全一致) config.background.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] btnMaximise.configuration = config } else { btnMaximise.backgroundColor = .white // 低版本仍使用layer设置圆角 btnMaximise.layer.cornerRadius = 5 btnMaximise.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] btnMaximise.layer.masksToBounds = true } btnMaximise.addTarget(self, action: #selector(didTapMaximise), for: .touchUpInside) // 配置最小化按钮 if #available(iOS 26.0, *) { var config = UIButton.Configuration.clearGlass() config.background.cornerRadius = 5 config.background.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] btnMinimise.configuration = config } else { btnMinimise.backgroundColor = .white btnMinimise.layer.cornerRadius = 5 btnMinimise.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] btnMinimise.layer.masksToBounds = true } btnMinimise.addTarget(self, action: #selector(didTapMinimise), for: .touchUpInside)
关键修改说明
iOS 26.0+分支核心调整:
- 新增
config.background.maskedCorners配置:iOS 26.0为UIButton.Configuration.Background新增了该属性,可直接指定需要圆角的角落,枚举值和CALayer的maskedCorners完全兼容; - 移除所有layer相关圆角设置:避免和Configuration的背景逻辑冲突,同时保留玻璃效果的完整性;
- 无需设置
layer.masksToBounds = true:玻璃效果依赖layer不裁剪子视图来实现模糊扩散,该属性会破坏毛玻璃视觉。
- 新增
低版本兼容:
保留原有的layer圆角设置逻辑,确保iOS <26.0版本的按钮样式和之前一致。
额外优化提示
如果需要自定义玻璃效果的模糊强度或色调,可在Configuration中扩展设置:
if #available(iOS 26.0, *) { var config = UIButton.Configuration.clearGlass() // 自定义模糊风格 config.background.effect = UIBlurEffect(style: .light) config.background.cornerRadius = 5 config.background.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] btnMaximise.configuration = config }




