iOS15下titleEdgeInsets废弃后设置UIButton内边距无效怎么办
问题背景
- 适配iOS15及以上版本时,Xcode抛出警告:
'titleEdgeInsets' was deprecated in iOS 15.0: This property is ignored when using UIButtonConfiguration - 尝试通过代码
btnPassword.configuration?.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20)设置按钮内边距,代码运行后无任何效果 - 参考过同类API废弃的适配方案,问题未解决
核心失效原因
configuration是UIButton在iOS15新增的值类型属性,默认值为nil。
- 当你通过可选链
btn.configuration?.xxx = xxx修改属性时,如果configuration本身是nil,这行代码不会执行任何逻辑,更不会自动创建configuration实例 - 即便已经给按钮设置过configuration,直接通过可选链修改属性,操作的也是结构体的临时不可变副本,修改不会同步到按钮本身
这是绝大多数开发者刚接触UIButtonConfiguration时都会踩的坑。
正确实现方案
方案1:使用系统推荐的UIButtonConfiguration(推荐,无警告)
这是苹果官方推荐的替代旧EdgeInsets的方案,步骤固定:
- 先创建对应样式的Configuration实例
- 修改内边距、标题、图片、间距等属性
- 将配置实例赋值给按钮的configuration属性
示例代码:
// 初始化配置,根据按钮样式选择plain/bordered/filled/tinted等类型 var btnConfig = UIButton.Configuration.plain() // 设置按钮整体内容内边距 btnConfig.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20) // 如果需要调整图片和标题的间距,直接设置imagePadding即可,无需手动计算偏移 // btnConfig.imagePadding = 8 // 设置按钮标题、图片等其他属性 btnConfig.title = "显示密码" // 将配置赋值给按钮,这一步绝对不能省略 btnPassword.configuration = btnConfig
如果后续需要动态修改内边距,必须取出配置为可变副本,修改后重新赋值:
// 取出当前配置 var newConfig = btnPassword.configuration // 修改内边距 newConfig?.contentInsets = NSDirectionalEdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16) // 重新赋值给按钮生效 btnPassword.configuration = newConfig
方案2:暂时兼容旧写法(不推荐,仅临时过渡用)
如果你暂时不想迁移到Configuration写法,只要保证不给按钮的configuration属性赋值任何值,旧的contentEdgeInsets、titleEdgeInsets、imageEdgeInsets属性在iOS15+版本依然可以正常生效,不会被系统忽略。
注意:系统只有在检测到按钮configuration属性不为nil时,才会主动忽略所有旧的EdgeInsets属性。该方案仅适合临时紧急适配,苹果后续iOS版本可能彻底移除旧EdgeInsets API,不建议长期使用。
内容的提问来源于stack exchange,提问作者Faaiz Daag
相关产品推荐
相关产品推荐

