如何根据屏幕设计缩放按钮文字swift?
How to scale the button text based on screen design swift?
在我的项目中,我对 UI 组件使用缩放。我可以像下面那样缩放 UIlabel 的文本,它在所有设备上都有效:
1. Autoshrinks - minimum font scale set it to 0.5
2. No of lines - 0
3. Enable dynamic type in attribute inspector
4. adjustFontSizeToWidth to true
但是当我尝试使用以下步骤调整 UI 按钮的字体时,我无法缩放 UI 按钮的文本。
button.titleLabel?.numberOfLines = 1 // Tried with 0 also
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.lineBreakMode = // tried differenet linebreakmode
谁能想到缩放 UI 按钮文本?
我认为没有办法让字体自动调整大小。但是,如果您将按钮的 titleLabel.font 设置为特定字体大小,按钮将更新以使用新的字体大小,包括调整按钮大小。
使用这样的代码:
let size: CGFloat = useLargeFont ? 50.0 : 17.0 //Change as needed
if let buttonFont = button.titleLabel?.font {
button.titleLabel?.font = buttonFont.withSize(size)
}
你确定它不起作用吗?
编辑 - 评论后...
UIUILabel
/UIButton
等套件元素没有内置“自动调整字体高度”属性.
我不为 Apple 工作,所以只是猜测(至少部分)是因为,一般来说...
根据屏幕高度,UI 设计为:
- 提供或多或少的信息,例如table 或
中的更多行
- 调整元素之间的垂直间距
这并不意味着您不能或不应该调整您的字体大小...这只是意味着您必须手动进行。
情侣选项:
- 按照 Duncan
的建议,在 运行 时设置字体大小
- 使用
UIAppearance
代理设置字体大小,再次在 运行-time
无论哪种情况,您都可以使用字体大小的高度 table 或“百分比”计算。
另一个选项是自定义 class,它根据受约束的按钮高度设置字体大小。
这里有一个简单的例子(注意:仅供演示):
class AutoFontSizeButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
guard let fnt = titleLabel?.font else { return }
// default system type button has 6-pts top / bottom inset
// and font size is 15/18ths of that height
let h = ((bounds.height - 12.0) * (15.0 / 18.0)).rounded()
let fs = fnt.pointSize
if h != fs {
titleLabel?.font = UIFont(descriptor: fnt.fontDescriptor, size: h)
}
}
}
结果 - 顶部的三个(黄色)按钮的高度分别为 30、40 和 50 磅,默认字体大小为 15。底部的三个(绿色)按钮再次为 30、40 和 50 磅高度,但字体大小自动设置为 运行-time:
在我的项目中,我对 UI 组件使用缩放。我可以像下面那样缩放 UIlabel 的文本,它在所有设备上都有效:
1. Autoshrinks - minimum font scale set it to 0.5
2. No of lines - 0
3. Enable dynamic type in attribute inspector
4. adjustFontSizeToWidth to true
但是当我尝试使用以下步骤调整 UI 按钮的字体时,我无法缩放 UI 按钮的文本。
button.titleLabel?.numberOfLines = 1 // Tried with 0 also
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.lineBreakMode = // tried differenet linebreakmode
谁能想到缩放 UI 按钮文本?
我认为没有办法让字体自动调整大小。但是,如果您将按钮的 titleLabel.font 设置为特定字体大小,按钮将更新以使用新的字体大小,包括调整按钮大小。
使用这样的代码:
let size: CGFloat = useLargeFont ? 50.0 : 17.0 //Change as needed
if let buttonFont = button.titleLabel?.font {
button.titleLabel?.font = buttonFont.withSize(size)
}
你确定它不起作用吗?
编辑 - 评论后...
UIUILabel
/UIButton
等套件元素没有内置“自动调整字体高度”属性.
我不为 Apple 工作,所以只是猜测(至少部分)是因为,一般来说...
根据屏幕高度,UI 设计为:
- 提供或多或少的信息,例如table 或 中的更多行
- 调整元素之间的垂直间距
这并不意味着您不能或不应该调整您的字体大小...这只是意味着您必须手动进行。
情侣选项:
- 按照 Duncan 的建议,在 运行 时设置字体大小
- 使用
UIAppearance
代理设置字体大小,再次在 运行-time
无论哪种情况,您都可以使用字体大小的高度 table 或“百分比”计算。
另一个选项是自定义 class,它根据受约束的按钮高度设置字体大小。
这里有一个简单的例子(注意:仅供演示):
class AutoFontSizeButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
guard let fnt = titleLabel?.font else { return }
// default system type button has 6-pts top / bottom inset
// and font size is 15/18ths of that height
let h = ((bounds.height - 12.0) * (15.0 / 18.0)).rounded()
let fs = fnt.pointSize
if h != fs {
titleLabel?.font = UIFont(descriptor: fnt.fontDescriptor, size: h)
}
}
}
结果 - 顶部的三个(黄色)按钮的高度分别为 30、40 和 50 磅,默认字体大小为 15。底部的三个(绿色)按钮再次为 30、40 和 50 磅高度,但字体大小自动设置为 运行-time: