在Swift中为不同的iOS设备使用不同的UIFont大小

4
我正在为iPhone系列开发基于Swift的iOS应用程序。我的应用程序支持从iPhone 4s到iPhone X的所有设备。在较小的设备(如iPhone 4s)上,标签显示得更大,因为我为高端设备添加了更大的字体大小。有人可以帮助我根据设备缩放字体吗?我尝试过使用紧凑/常规宽度和紧凑/常规高度的大小类,但它们都没有帮助我。非常感谢您的帮助。

Storyboard font setting Rendering app on different devices


最好展示一下你尝试过的内容,Stack Overflow 上有很多关于这个问题的帖子。 - Praveen Gowlikar
https://dev59.com/bJjga4cB1Zd3GeqPLoqg - Praveen Gowlikar
有没有办法在故事板本身设置这个,而不是编写代码和映射字体大小? - AskIOS
3个回答

5

以编程方式

不使用storyboard,我有一个方法可以根据屏幕宽度简单地更改字体大小:

func dynamicFontSize(_ FontSize: CGFloat) -> CGFloat {
    let screenWidth = UIScreen.main.bounds.size.width
    let calculatedFontSize = screenWidth / 375 * FontSize
    return calculatedFontSize
}

并且可以用作:

myLabel.font = UIFont(name: "Helvetica", size: dynamicFontSize(20))

请注意,在 dynamicFontSize 函数中,数字 375 只是字体大小计算的基础,因为我通常在 iPhone 8 上测试我的应用程序(即由于其实际宽度为 375,字体大小 18 实际上 在 iPhone 8 上为 18)。此数字可根据您的喜好进行更改。
故事板
如果您坚持使用故事板,您可以创建一个新的 Swift 文件,子类化 UILabel 并使用 @IBInspectable,如下所示:
import UIKit

class UILabelFontClass: UILabel {

    @IBInspectable var DynamicFontSize: CGFloat = 0 {
        didSet {
            overrideFontSize(FontSize: DynamicFontSize)
        }
    }

    func overrideFontSize(FontSize: CGFloat){
        let fontName = self.font.fontName
        let screenWidth = UIScreen.main.bounds.size.width
        let calculatedFontSize = screenWidth / 375 * FontSize
        self.font = UIFont(name: fontName, size: calculatedFontSize)
    }
}

UILabelFontClass 子类化到你的标签中:

Subclassing_UILabelFontClass

现在在属性检查器中,您可以设置字体大小:

Attributes_inspector_set_fontsize

3
你可以在Storyboard中根据视图尝试设置标签高度。
根据这个图片参考,我使用iPhone 5s屏幕大小,并将标签高度设置为乘数30/554。

enter image description here


我在想这是否是最佳实践?我的应用程序支持近25个控制器,标签数量也没有近似计数。如果未来需要更改,这可能会很繁琐。顺便说一句,谢谢。 - AskIOS
以编程方式设置将是最有效的。 - Jake

0

不必为UILabel创建不同的类。您可以创建UILabel 扩展并使用此IBDesignable解决方案从Storyboard中设置值。

这里的基础宽度为375pt

extension UILabel{
     @IBInspectable
     var scaleSize: CGFloat {
        set {
            let fontName = self.font.fontName
            let screenWidth = UIScreen.main.bounds.size.width
            let calculatedFontSize = screenWidth / 375 * newValue
            self.font = UIFont(name: fontName, size: calculatedFontSize)
        }
        get {
            return self.scaleSize
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接