如何根据屏幕设计缩放按钮文字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: