iOS15 UIButton新配置下AttributedString适配宽度缩字体的疑问
核心问题原因
UIButton的新配置(Configuration)模式下,默认允许标题换行,且通过Markdown生成的AttributedString会自带默认段落样式,同时配置更新可能重置titleLabel的缩放设置,导致adjustsFontSizeToFitWidth失效。
解决步骤
强制标题单行并开启字体缩放
必须显式设置titleLabel的单行属性和缩放参数,确保按钮优先缩小字体而非换行:// 在设置configuration后添加 myButton.titleLabel?.numberOfLines = 1 myButton.titleLabel?.adjustsFontSizeToFitWidth = true myButton.titleLabel?.minimumScaleFactor = 0.5 // 可根据需求调整最小缩放比例,如0.3 myButton.titleLabel?.lineBreakMode = .byClipping // 禁止换行,优先缩放字体修正AttributedString的段落样式
Markdown生成的AttributedString默认允许换行,需手动覆盖为单行段落样式:guard var attributedString = try? AttributedString(markdown: "hello **hello** hello") else { return } // 创建单行段落样式 let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineBreakMode = .byClipping paragraphStyle.maximumLineHeight = attributedString.font?.lineHeight ?? 18 paragraphStyle.minimumLineHeight = attributedString.font?.lineHeight ?? 18 // 应用段落样式到AttributedString attributedString.paragraphStyle = paragraphStyle myButton.configuration?.attributedTitle = attributedString配置更新时保留设置
若使用configurationUpdateHandler,需在handler中重复设置titleLabel属性,避免按钮状态变化时被重置:let handler: UIButton.ConfigurationUpdateHandler = { button in button.configuration?.background.backgroundColor = Colors.specLabel button.configuration?.baseForegroundColor = Colors.greyText // 确保状态更新后仍保留缩放设置 button.titleLabel?.numberOfLines = 1 button.titleLabel?.adjustsFontSizeToFitWidth = true button.titleLabel?.minimumScaleFactor = 0.5 button.titleLabel?.lineBreakMode = .byClipping }调整布局优先级(可选)
若按钮所在布局导致宽度被过度拉伸,可设置内容优先级确保按钮宽度适配标题:myButton.setContentHuggingPriority(.defaultHigh, for: .horizontal) myButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
内容的提问来源于stack exchange,提问作者zakray
相关产品推荐
相关产品推荐

