是否有人在attributedTitle
上为UIButton
工作的动态类型?考虑下面的 super 简单代码:
let font = UIFont(name: "Helvetica", size: 14)!
let scaledFont = UIFontMetrics.default.scaledFont(for: font)
let button = UIButton(type: .custom)
button.titleLabel?.font = scaledFont
button.titleLabel?.adjustsFontForContentSizeCategory = true
let attributes: [NSAttributedString.Key: Any] = [ .font: scaledFont ]
let attributedText = NSAttributedString(string: "Press me", attributes: attributes)
button.setAttributedTitle(attributedText, for: .normal)
如果我使用Accessibility Inspector缩放字体大小,则按钮的大小和标签文本将无法正确缩放。
但是,如果我只是调用
button.setTitle()
传递普通字符串,则动态类型缩放效果很好。直接在
UILabel
上对属性文本使用相同的模式很好用……似乎只是在我将属性文本用作UIButton
的标题时。任何想法或建议都很棒。谢谢
编辑:再戳一遍之后,似乎正在发生文本尝试缩放的问题,但是按钮的宽度/高度并未随之增加。如果我将动态类型拨号到最大文本大小,然后创建屏幕并继续缩小字体大小,则可以正常工作,因为按钮的宽度/高度约束设置为初始较大的值。但是,如果我先从小的动态类型设置开始,然后逐渐变大,则该按钮将无法适应文本大小的更改
最佳答案
如果我使用Accessibility Inspector缩放字体大小,则按钮的大小和标签文本将无法正确缩放。
要使用UIButton
缩放Dynamic Type
的属性字符串标签,首先将标题标签设置为属性字符串,然后将此元素放在setAttributedTitle
按钮方法中。
关于按钮大小,请在 sizeToFit
协议的 traitCollectionDidChange 实例方法中指定按钮的UITraitEnvironment
方法(使用约束也可以是另一种解决方案)。
我在Xcode中创建了一个空白项目,如下所示:
复制以下代码片段(Swift 5.0,iOS 12):
class ViewController: UIViewController {
@IBOutlet weak var myButton: UIButton!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
myButton.layer.borderColor = UIColor.black.cgColor
myButton.layer.borderWidth = 4.0
myButton.contentEdgeInsets = UIEdgeInsets(top: 10,
left: 20,
bottom: 10,
right: 20)
let font = UIFont(name: "Helvetica", size: 19)!
let scaledFont = UIFontMetrics.default.scaledFont(for: font)
let attributes = [NSAttributedString.Key.font: scaledFont]
let attributedText = NSAttributedString(string: "Press me",
attributes: attributes)
myButton.titleLabel?.attributedText = attributedText
myButton.setAttributedTitle(myButton.titleLabel?.attributedText,
for: .normal)
myButton.titleLabel?.adjustsFontForContentSizeCategory = true
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
myButton.sizeToFit()
}
}
...,您将在下面获得结果:
如果您需要进一步的说明,建议您看一下包含{code snippets + illustrations}的Dynamic Type kind of tutorial以及处理使用动态类型构建应用程序的WWDC detailed summary。