Swift中不同iOS设备的UIFont大小不同

时间:2018-06-22 05:39:33

标签: swift uilabel uifont

我正在为iPhone系列开发基于Swift的iOS应用程序。我的应用程序支持从iPhone 4s到iPhone X的所有设备。随着我为高端设备增加了较大的字体大小,在较小的设备(如iPhone 4s)中,标签的显示也变大了。有人可以帮助我如何根据设备缩放字体。我尝试了具有紧凑/常规宽度和紧凑/常规高度的尺寸类别,但没有一个对我有帮助。非常感谢您的帮助

Storyboard font setting Rendering app on different devices

3 个答案:

答案 0 :(得分:3)

您可以根据情节提要中的视图尝试将标签标注为高。

使用此图像参考我完成了iPhone 5s屏幕尺寸的设置,并给标签hight等于乘数30/554中的hight

enter image description here

答案 1 :(得分:1)

以编程方式

无需使用情节提要,我可以根据屏幕宽度简单地更改字体大小,如下所示:

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上测试我的应用程序(即字体大小18 在iPhone 8上实际上是18,因为其实际宽度为375)。您可以根据自己的喜好更改此数字。

故事板

如果您坚持使用情节提要,则可以创建一个新的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)
    }
}

标签中的内部故事板子类UILabelFontClassSubclassing_UILabelFontClass

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

答案 2 :(得分:0)

不是为UILabel创建不同的类。您可以进行 UILabel 扩展,并使用此 IBDesignable解决方案从情节提要中设置值。

此处基本宽度为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
        }
    }
}