子类化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
相关产品推荐
相关产品推荐

