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

子类化UIButton通过协议代理设置标题后字号意外变更问题咨询

根本原因

  • 自定义按钮类的初始化逻辑不完整:通过Storyboard加载的UIButton会走init?(coder:)初始化方法,你仅在init(frame:)中设置了字号,init(coder:)中没有对应的字号设置逻辑,纯代码初始化的字号设置对Storyboard加载的按钮不生效。
  • iOS 15+ 系统的UIButton新特性冲突:iOS 15之后UIButton默认采用UIButton.Configuration管理样式属性,直接修改titleLabel的font属于旧版API操作,调用setTitle(_:for:)更新标题时,系统会自动用Configuration内置的默认字体配置(默认17号)覆盖你手动设置的titleLabel.font,这就是断点处字号还是14、执行完setTitle后字号变大的核心原因。

修复方案

方案1:补全自定义类初始化逻辑,适配新旧系统API

修改自定义按钮类代码,两个初始化方法都执行字号设置,同时适配iOS15+的Configuration特性:

import UIKit

class TypeButton: UIButton {
    private let targetFont = UIFont(name: "Helvetica", size: 14)
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupFixedFont()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupFixedFont()
    }
    
    private func setupFixedFont() {
        if #available(iOS 15.0, *) {
            // 适配新的Configuration样式管理
            configuration?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { [weak self] attributes in
                var modifiedAttrs = attributes
                modifiedAttrs.font = self?.targetFont
                return modifiedAttrs
            }
        } else {
            // 旧系统直接设置titleLabel字体
            titleLabel?.font = targetFont
        }
    }
}

方案2:沿用旧版UIButton逻辑

如果你不需要使用iOS15+的新按钮样式,直接在Storyboard的按钮属性面板中,将Style选项从Plain改为Default,就会禁用Configuration样式管理,直接修改titleLabel.font即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:06