首页 > 解决方案 > iPhone 为较大的设备增加字体大小

问题描述

我有一个简单的应用程序,其中有一些视图要显示。它是纵向应用程序,因此我不必为特定方向构建任何其他设计。

但是我有一个麻烦(在 iOS 上是新手),我已经阅读了有关尺寸等级的信息,但我无法理解如何增加每台设备的文本/标签的大小。

我做了什么:

我的意思是我正在以下手机上进行测试

  1. iPhone 5S
  2. iPhone 8+
  3. iPhone XR

我在视图中有一个标签,该标签有 18 个点作为文本大小或字体大小

我想要的是:

我希望我的字体必须在 iPhone XR 和 iPad 等大型设备上逐渐增大,在 iPhone 5s 等小型设备上逐渐减小

问题:我想做以下事情,但即使使用尺寸等级我也不知道该怎么做,因为据我所知,尺寸等级与方向最相关,可能是我错了,但这是我从阅读中提取的

我想在下面的电话上,文字大小必须是这样的

  1. iPhone 5s --> 文字大小 12
  2. iPhone 8Plus --> 文字大小 18
  3. iPhone XR --> 文字大小 19
  4. iPadPro 12 英寸 --> 文字大小 32

请让我知道如何实现这一目标?

注意:我想在没有编码的情况下做到这一点,我的意思是在界面生成器中

标签: iosswift4.2xcode10.2

解决方案


解决您的问题。您需要识别用户设备模式。

enum DeviceModals : String {
    //iphones
    case iPhone5s_GSM = "iPhone6,1"
    case iPhone5s_China_Gobal = "iPhone6,2"
    case iPhone6_Plus = "iPhone7,1"
    case iPhone6 = "iPhone7,2"
    case iPhone6S = "iPhone8,1"
    case iPhone6S_Plus = "iPhone8,2"
    case iPhoneSE = "iPhone8,4"
    case iPhone7_CDMA = "iPhone9,1"
    case iPhone7_GSM = "iPhone9,3"
    case iPhone7_Plus_CDMA = "iPhone9,2"
    case iPhone7_Plus_GSM = "iPhone9,4"
    case iPhone_8_CDMA =   "iPhone10,1"
    case iPhone_8_GSM =  "iPhone10,4"
    case iPhone_8_Plus_CDMA =  "iPhone10,2"
    case iPhone_8_Plus_GSM =  "iPhone10,5"
    case iPhone_X_CDMA = "iPhone10,3"
    case iPhone_X_GSM =  "iPhone10,6"
    case iPhone_XS = "iPhone11,2"
    case iPhone_XS_Max =   "iPhone11,4"
    case iPhone_XS_Max_China = "iPhone11,6"
    case iPhone_XR =   "iPhone11,8"
    case iPhone_11 =   "iPhone12,1"
    case iPhone_11_Pro =  "iPhone12,3"
    case iPhone_11_Pro_Max =  "iPhone12,5"

    //iPad
   case iPad_Air_wifi_5Gen  =  "iPad4,1"
   case iPad_Air_cellular_5Gen =  "iPad4,2"
   case iPad_Mini_wifi_2Gen = "iPad4,4"
   case iPad_Mini_cellular_2Gen = "iPad4,5"
   case iPad_Mini_wifi_3rd_Gen =  "iPad4,7"
   case iPad_Pro_12_9_A1584 =  "iPad6,7"
   case iPad_Pro_12_9_A1652 =  "iPad6,8"
   case iPad_Pro_9_7_A1673 =  "iPad6,3"
   case iPad_Pro_9_7_A1674 =  "iPad6,4"

    case otherDevice = "other"

}
extension UIDevice {
    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        return identifier
    }
    func deviceModal() -> DeviceModals{
        let deviceName  = UIDevice.current.modelName
        let deviceModal = DeviceModals(rawValue: deviceName) ?? DeviceModals.otherDevice
        return deviceModal
    }
}

如果您在应用中支持辅助功能。用户将在您的应用中拥有一个文本大小控制器。

设置 -> 显示和亮度 -> 文字大小。

此默认大小将根据设备大小针对不同设备进行更改。

    extension UIFont
    {
    // A scale value based on the current device text size setting.    With the device using the default Large setting, `scaler` will be `1.0`. Only used when `UIFontMetrics` is not available.
        var scaler: CGFloat {
            return UIFont.preferredFont(forTextStyle:.body).pointSize/17.0
         }
       func scaledFont() -> UIFont {
            if #available(iOS 11.0, *) {
                return UIFontMetrics.default.scaledFont(for: self)
            } else {
                return self.withSize(scaler * self.pointSize)
            }
        }
    }

您现在可以按钮字体。

UILabel().font = UIFont.systemFont(ofSize: 12).scaledFont() 

现在您知道用户拥有哪些设备,因此您可以使用文本数据创建一个自定义标签(或)按钮(或)AnyComponent。

class CustomLabel : UILabel{

    override func awakeFromNib() {
        super.awakeFromNib()
        let deviceModal = UIDevice.current.deviceModal()
        var font_size : CGFloat = 18
        switch deviceModal {
        case .iPhone5s_GSM , .iPhone5s_China_Gobal  :
            font_size = 12
        case .iPhone_8_Plus_CDMA , .iPhone_8_Plus_GSM:
           font_size = 18
        case .iPhone_XR:
            font_size = 19
        default:
            font_size = 18
        }
        self.font = UIFont.systemFont(ofSize: font_size).scaledFont()
    }
}

在您的故事板中选择您的标签,转到右上角并选择自定义类并输入“CustomLabel”。现在您不必编写任何其他代码,它可以完美运行。

在此处输入图像描述

我希望你的问题现在得到解决。


推荐阅读