是否有人在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中创建了一个空白项目,如下所示:
ios - UIButton的attributeTitle的动态类型-LMLPHP

复制以下代码片段(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()
    }
}

...,您将在下面获得结果:
ios - UIButton的attributeTitle的动态类型-LMLPHP
如果您需要进一步的说明,建议您看一下包含{code snippets + illustrations}的Dynamic Type kind of tutorial以及处理使用动态类型构建应用程序的WWDC detailed summary

10-06 08:19