You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:iOS14下Button标题与图片无法渲染,iOS13及以下正常

解决iOS14下自定义Button标题/图片无法渲染的问题

你遇到的问题根源在于自定义RoundedButton中,把图层圆角的设置逻辑放在了draw(_ rect:)方法里——这个写法在iOS13及以前能正常工作,但iOS14对UIKit的布局与绘制流程做了调整,导致按钮内容(标题、图片)的渲染被干扰。

为什么原来的代码会出问题?

draw(_ rect:)的设计初衷是用于自定义绘制内容,而不是处理布局或图层属性设置。在iOS14中,UIButton的内部渲染时机发生了变化:当你在draw(_ rect:)里修改cornerRadius和masksToBounds时,会打乱按钮内部标题/图片的布局计算流程,甚至在bounds还未完全确定的情况下就裁切了内容,最终导致它们无法正常显示。

修复方案

把圆角设置逻辑移到layoutSubviews()方法中——这是UIKit专门用于处理布局更新的生命周期方法,能保证在按钮的bounds完全确定后再设置圆角:

class RoundedButton: UIButton { 
    override func layoutSubviews() {
        super.layoutSubviews()
        self.layer.cornerRadius = self.bounds.height / 2 
        self.layer.masksToBounds = true 
    }
}

额外优化提示

如果你的按钮需要支持动态字体或自适应布局,还可以补充以下设置避免内容被圆角裁切:

  • 给按钮添加合适的contentEdgeInsets,让标题/图片与按钮边缘保持一定间距:
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.contentEdgeInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
    }
    
  • 仅在需要自定义绘制内容时,才使用draw(_ rect:)方法,不要把布局相关的属性设置放在这里。

这样修改后,按钮的标题和图片就能在iOS14及所有旧版本中正常渲染了。

内容的提问来源于stack exchange,提问作者Kedar Sukerkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:47:51