ios - iPhone 为较大的设备增加字体大小
问题描述
我有一个简单的应用程序,其中有一些视图要显示。它是纵向应用程序,因此我不必为特定方向构建任何其他设计。
但是我有一个麻烦(在 iOS 上是新手),我已经阅读了有关尺寸等级的信息,但我无法理解如何增加每台设备的文本/标签的大小。
我做了什么:
我的意思是我正在以下手机上进行测试
- iPhone 5S
- iPhone 8+
- iPhone XR
我在视图中有一个标签,该标签有 18 个点作为文本大小或字体大小
我想要的是:
我希望我的字体必须在 iPhone XR 和 iPad 等大型设备上逐渐增大,在 iPhone 5s 等小型设备上逐渐减小
问题:我想做以下事情,但即使使用尺寸等级我也不知道该怎么做,因为据我所知,尺寸等级与方向最相关,可能是我错了,但这是我从阅读中提取的
我想在下面的电话上,文字大小必须是这样的
- iPhone 5s --> 文字大小 12
- iPhone 8Plus --> 文字大小 18
- iPhone XR --> 文字大小 19
- iPadPro 12 英寸 --> 文字大小 32
请让我知道如何实现这一目标?
注意:我想在没有编码的情况下做到这一点,我的意思是在界面生成器中
解决方案
解决您的问题。您需要识别用户设备模式。
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”。现在您不必编写任何其他代码,它可以完美运行。
我希望你的问题现在得到解决。
推荐阅读
- python-3.x - 带有列表操作的循环的简写
- tinymce - 如何向 TinyMCE 添加一个共同的父级?
- javascript - 使用相同的按钮 Javascript 打开关闭相机
- shopify - Shopify 在同一域中使用其他应用
- sqlite - 我如何动态旋转sqlite android
- spring-boot - 创建连接工厂数据源以在 JdbcTemplate springboot 中使用
- angularjs - 带有输入干扰枚举选择的 ngModel
- docker - 与非技术人员共享 Jupyter Notebook/Lab 输出
- windows - 如何将字符串发送到外部文本编辑器?
- api - youtube API nextPageToken 用于谷歌表格中的评论:重复标记或未定义