有人在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
的标题使用属性文本时。
任何想法或建议都很棒。谢谢
编辑:经过一番戳后,似乎正在尝试缩放文本,但是按钮的宽度/高度并未随之增加。如果我将动态类型拨到最大的文本大小,然后创建屏幕并继续缩小字体大小,则可以正常工作,因为按钮的宽度/高度约束设置为初始较大的值。但是,如果我先从小的动态类型设置开始,然后逐渐变大,则该按钮将无法适应文本大小的更改
答案 0 :(得分:1)
如果我使用Accessibility Inspector上下缩放字体大小,则按钮的大小和标签文本将无法正确缩放。
要使用UIButton
缩放Dynamic Type
的属性字符串标签,请首先将标题标签设置为属性字符串,然后将此元素放入{{1 }}按钮方法。
关于按钮的大小,请在UITraitEnvironment
协议的 traitCollectionDidChange 实例方法中指定按钮的setAttributedTitle
方法(使用约束可以是另一种解决方案好)。
将代码段复制并粘贴到(Swift 5.0,iOS 12)下:
sizeToFit
...,您将在下面获得结果: 如果您需要进一步的说明,建议您查看包含{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
如果将attributedText
与labelAttributedText
进行比较,可以看到前者是NSConcreteAttributedString
,而后者是NSConcreteMutableAttributedString
。询问他们返回的回报是否相等true
,并快速比较它们的属性似乎表明它们确实相同,但是必须有些许不同。
我最初尝试将attributedText
创建为可变属性字符串,但这也无济于事。非常令人困惑,但是非常感谢@ XLE_22给出的提示...我怀疑自己是否会尝试过这种特殊的技巧。