UIButton的attributeTitle

时间:2019-06-30 02:14:41

标签: ios uibutton uikit accessibility

有人在attributedTitle上为UIButton使用动态类型吗?考虑下面的超级简单代码:

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的标题使用属性文本时。

任何想法或建议都很棒。谢谢

编辑:经过一番戳后,似乎正在尝试缩放文本,但是按钮的宽度/高度并未随之增加。如果我将动态类型拨到最大的文本大小,然后创建屏幕并继续缩小字体大小,则可以正常工作,因为按钮的宽度/高度约束设置为初始较大的值。但是,如果我先从小的动态类型设置开始,然后逐渐变大,则该按钮将无法适应文本大小的更改

2 个答案:

答案 0 :(得分:1)

  

如果我使用Accessibility Inspector上下缩放字体大小,则按钮的大小和标签文本将无法正确缩放。

要使用UIButton缩放Dynamic Type的属性字符串标签,请首先将标题标签设置为属性字符串,然后将此元素放入{{1 }}按钮方法。

关于按钮的大小,请在UITraitEnvironment协议 traitCollectionDidChange 实例方法中指定按钮的setAttributedTitle方法(使用约束可以是另一种解决方案好)

我在Xcode中创建了一个空白项目,如下所示: enter image description here

将代码段复制并粘贴到(Swift 5.0,iOS 12)下:

sizeToFit

...,您将在下面获得结果: enter image description here 如果您需要进一步的说明,建议您查看包含{code snippets + illustrations}的Dynamic Type kind of tutorial以及用于构建具有动态类型的应用程序的WWDC detailed summary

答案 1 :(得分:1)

以防万一有人跟进,解决此问题的关键包含在@ XLE_22帖子的第一段中,但非常微妙。

在按钮上调用setAttributedTitle()时,您需要传递标签中的属性字符串。即。 myButton.titleLabel?.attributedText ...传递局部变量attributedText不起作用。我无法合理地解释为什么会这样。考虑以下代码:

myButton.titleLabel?.attributedText = attributedText
let labelAttributedText = myButton.titleLabel?.attributedText

myButton.setAttributedTitle(labelAttributedText, for: .normal)  // works
myButton.setAttributedTitle(attributedText, for: .normal)       // doesn't work

如果将attributedTextlabelAttributedText进行比较,可以看到前者是NSConcreteAttributedString,而后者是NSConcreteMutableAttributedString。询问他们返回的回报是否相等true,并快速比较它们的属性似乎表明它们确实相同,但是必须有些许不同。

我最初尝试将attributedText创建为可变属性字符串,但这也无济于事。非常令人困惑,但是非常感谢@ XLE_22给出的提示...我怀疑自己是否会尝试过这种特殊的技巧。