我要使项目和字体大小与屏幕大小相同。我曾经使用项目比例来缩放以处理不同的iOS屏幕,但是项目的大小存在问题,导致iOS屏幕更大。此外,我创建了FontHelper来调整字体大小作为屏幕大小。例如,如果我定义了iPhone SE中的字体大小为17,iPhone 8中的字体大小为19,iPhone 8 Plus中的字体大小为21。据我所知,如果我将项目大小的高度定义为一个特定的数字,它将作为设备屏幕进行调整。标签的字体大小使用相同的方法,如果我将字体大小定义为特定数字,则由于它是由点定义的,因此将被调整为设备屏幕,但是我创建了XIB文件并放置了具有不同高度和标签的视图,并使用了不同的字体大小检查它们是否会被调整。如您所见,它们看起来完全一样。
他们是否进行了调整,或者我对iOS开发中的Point完全误解了?是否有建议针对不同的iOS设备处理大小和字体?
答案 0 :(得分:4)
如果要为不同的iPhone型号处理不同的字体大小。您必须为此创建自定义类。检查以下代码:
import Foundation
import UIKit
// for label
class ClassLabelSizeClass: UILabel {
override func awakeFromNib() {
super.awakeFromNib()
switch UIDevice().type {
case .iPhoneSE, .iPhone5, .iPhone5S, .iPhone5C:
self.font = self.font.withSize(?*self.font.pointSize)
case .iPhone6, .iPhone6S, .iPhone7, .iPhone8:
self.font = self.font.withSize(?*self.font.pointSize + 2)
case .iPhone6plus, .iPhone6Splus, .iPhone7plus, .iPhone8plus:
self.font = self.font.withSize(?*self.font.pointSize + 2)
case .iPhoneX, .iPhoneXR, .iPhoneXS, .iPhoneXSMax:
self.font = self.font.withSize(?*self.font.pointSize + 3)
default:
self.font = self.font.withSize(?*self.font.pointSize + 4)
}
}
}
//for textfield
class ClassTextFieldSizeClass: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
switch UIDevice().type {
case .iPhoneSE, .iPhone5, .iPhone5S, .iPhone5C:
self.font = self.font?.withSize(?*self.font?.pointSize)
case .iPhone6, .iPhone6S, .iPhone7, .iPhone8:
self.font = self.font?.withSize(?*self.font?.pointSize + 2)
case .iPhone6plus, .iPhone6Splus, .iPhone7plus, .iPhone8plus:
self.font = self.font?.withSize(?*self.font?.pointSize + 2)
case .iPhoneX, .iPhoneXR, .iPhoneXS, .iPhoneXSMax:
self.font = self.font?.withSize(?*self.font?.pointSize + 3)
default:
self.font = self.font?.withSize(?*self.font?.pointSize + 4)
}
}
}
//for button
class ClassButtonSizeClass: UIButton {
override func awakeFromNib() {
super.awakeFromNib()
switch UIDevice().type {
case .iPhoneSE, .iPhone5, .iPhone5S, .iPhone5C:
self.titleLabel?.font = self.titleLabel?.font.withSize(?*self.titleLabel?.font.pointSize)
case .iPhone6, .iPhone6S, .iPhone7, .iPhone8:
self.titleLabel?.font = self.titleLabel?.font.withSize(?*self.titleLabel?.font.pointSize + 2)
case .iPhone6plus, .iPhone6Splus, .iPhone7plus, .iPhone8plus:
self.titleLabel?.font = self.titleLabel?.font.withSize(?*self.titleLabel?.font.pointSize + 2)
case .iPhoneX, .iPhoneXR, .iPhoneXS, .iPhoneXSMax:
self.titleLabel?.font = self.titleLabel?.font.withSize(?*self.titleLabel?.font.pointSize + 3)
default:
self.titleLabel?.font = self.titleLabel?.font.withSize(?*self.titleLabel?.font.pointSize + 4)
}
}
}
// for textView
class ClassTextViewSizeClass: UITextView {
override func awakeFromNib() {
super.awakeFromNib()
switch UIDevice().type {
case .iPhoneSE, .iPhone5, .iPhone5S, .iPhone5C:
self.font = self.font?.withSize(?*self.font?.pointSize)
case .iPhone6, .iPhone6S, .iPhone7, .iPhone8:
self.font = self.font?.withSize(?*self.font?.pointSize + 2)
case .iPhone6plus, .iPhone6Splus, .iPhone7plus, .iPhone8plus:
self.font = self.font?.withSize(?*self.font?.pointSize + 2)
case .iPhoneX, .iPhoneXR, .iPhoneXS, .iPhoneXSMax:
self.font = self.font?.withSize(?*self.font?.pointSize + 3)
default:
self.font = self.font?.withSize(?*self.font?.pointSize + 4)
}
}
}
//for custom value returning
class ClassUIDeviceTypeReturn {
static let shared = ClassUIDeviceTypeReturn()
func returnFloatValue(iPhone5: CGFloat, iPhone6: CGFloat, iPhone6Plus: CGFloat, iPhoneX: CGFloat, iPadDefault: CGFloat) -> CGFloat {
switch UIDevice().type {
case .iPhoneSE, .iPhone5, .iPhone5S, .iPhone5C:
return iPhone5
case .iPhone6, .iPhone6S, .iPhone7, .iPhone8:
return iPhone6
case .iPhone6plus, .iPhone6Splus, .iPhone7plus, .iPhone8plus:
return iPhone6Plus
case .iPhoneX, .iPhoneXR, .iPhoneXS, .iPhoneXSMax:
return iPhoneX
default:
return iPadDefault
}
}
}
public enum EnumModel: String {
case simulator = "simulator/sandbox",
//iPod
iPod1 = "iPod 1",
iPod2 = "iPod 2",
iPod3 = "iPod 3",
iPod4 = "iPod 4",
iPod5 = "iPod 5",
//iPad
iPad2 = "iPad 2",
iPad3 = "iPad 3",
iPad4 = "iPad 4",
iPadAir = "iPad Air ",
iPadAir2 = "iPad Air 2",
iPad5 = "iPad 5", //aka iPad 2017
iPad6 = "iPad 6", //aka iPad 2018
//iPad mini
iPadMini = "iPad Mini",
iPadMini2 = "iPad Mini 2",
iPadMini3 = "iPad Mini 3",
iPadMini4 = "iPad Mini 4",
//iPad pro
iPadPro9_7 = "iPad Pro 9.7\"",
iPadPro10_5 = "iPad Pro 10.5\"",
iPadPro12_9 = "iPad Pro 12.9\"",
iPadPro2_12_9 = "iPad Pro 2 12.9\"",
//iPhone
iPhone4 = "iPhone 4",
iPhone4S = "iPhone 4S",
iPhone5 = "iPhone 5",
iPhone5S = "iPhone 5S",
iPhone5C = "iPhone 5C",
iPhone6 = "iPhone 6",
iPhone6plus = "iPhone 6 Plus",
iPhone6S = "iPhone 6S",
iPhone6Splus = "iPhone 6S Plus",
iPhoneSE = "iPhone SE",
iPhone7 = "iPhone 7",
iPhone7plus = "iPhone 7 Plus",
iPhone8 = "iPhone 8",
iPhone8plus = "iPhone 8 Plus",
iPhoneX = "iPhone X",
iPhoneXS = "iPhone XS",
iPhoneXSMax = "iPhone XS Max",
iPhoneXR = "iPhone XR",
//Apple TV
AppleTV = "Apple TV",
AppleTV_4K = "Apple TV 4K",
unrecognized = "?unrecognized?"
}
// #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
// MARK: UIDevice extensions
// #-#-#-#-#-#-#-#-#-#-#-#-#-#-#
public extension UIDevice {
public var type: EnumModel {
var systemInfo = utsname()
uname(&systemInfo)
let modelCode = withUnsafePointer(to: &systemInfo.machine) {
$0.withMemoryRebound(to: CChar.self, capacity: 1) {
ptr in String.init(validatingUTF8: ptr)
}
}
var modelMap : [ String: EnumModel ] = [
"i386": .simulator,
"x86_64": .simulator,
//iPod
"iPod1,1": .iPod1,
"iPod2,1": .iPod2,
"iPod3,1": .iPod3,
"iPod4,1": .iPod4,
"iPod5,1": .iPod5,
//iPad
"iPad2,1": .iPad2,
"iPad2,2": .iPad2,
"iPad2,3": .iPad2,
"iPad2,4": .iPad2,
"iPad3,1": .iPad3,
"iPad3,2": .iPad3,
"iPad3,3": .iPad3,
"iPad3,4": .iPad4,
"iPad3,5": .iPad4,
"iPad3,6": .iPad4,
"iPad4,1": .iPadAir,
"iPad4,2": .iPadAir,
"iPad4,3": .iPadAir,
"iPad5,3": .iPadAir2,
"iPad5,4": .iPadAir2,
"iPad6,11": .iPad5, //aka iPad 2017
"iPad6,12": .iPad5,
"iPad7,5": .iPad6, //aka iPad 2018
"iPad7,6": .iPad6,
//iPad mini
"iPad2,5": .iPadMini,
"iPad2,6": .iPadMini,
"iPad2,7": .iPadMini,
"iPad4,4": .iPadMini2,
"iPad4,5": .iPadMini2,
"iPad4,6": .iPadMini2,
"iPad4,7": .iPadMini3,
"iPad4,8": .iPadMini3,
"iPad4,9": .iPadMini3,
"iPad5,1": .iPadMini4,
"iPad5,2": .iPadMini4,
//iPad pro
"iPad6,3": .iPadPro9_7,
"iPad6,4": .iPadPro9_7,
"iPad7,3": .iPadPro10_5,
"iPad7,4": .iPadPro10_5,
"iPad6,7": .iPadPro12_9,
"iPad6,8": .iPadPro12_9,
"iPad7,1": .iPadPro2_12_9,
"iPad7,2": .iPadPro2_12_9,
//iPhone
"iPhone3,1": .iPhone4,
"iPhone3,2": .iPhone4,
"iPhone3,3": .iPhone4,
"iPhone4,1": .iPhone4S,
"iPhone5,1": .iPhone5,
"iPhone5,2": .iPhone5,
"iPhone5,3": .iPhone5C,
"iPhone5,4": .iPhone5C,
"iPhone6,1": .iPhone5S,
"iPhone6,2": .iPhone5S,
"iPhone7,1": .iPhone6plus,
"iPhone7,2": .iPhone6,
"iPhone8,1": .iPhone6S,
"iPhone8,2": .iPhone6Splus,
"iPhone8,4": .iPhoneSE,
"iPhone9,1": .iPhone7,
"iPhone9,3": .iPhone7,
"iPhone9,2": .iPhone7plus,
"iPhone9,4": .iPhone7plus,
"iPhone10,1": .iPhone8,
"iPhone10,4": .iPhone8,
"iPhone10,2": .iPhone8plus,
"iPhone10,5": .iPhone8plus,
"iPhone10,3": .iPhoneX,
"iPhone10,6": .iPhoneX,
"iPhone11,2": .iPhoneXS,
"iPhone11,4": .iPhoneXSMax,
"iPhone11,6": .iPhoneXSMax,
"iPhone11,8": .iPhoneXR,
//AppleTV
"AppleTV5,3": .AppleTV,
"AppleTV6,2": .AppleTV_4K
]
if let model = modelMap[String.init(validatingUTF8: modelCode!)!] {
if model == .simulator {
if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
if let simModel = modelMap[String.init(validatingUTF8: simModelCode)!] {
return simModel
}
}
}
return model
}
return EnumModel.unrecognized
}
}
别忘了给故事板中的标签,文本框,按钮,textView提供自定义类。
希望它会有所帮助:)
答案 1 :(得分:1)
尝试此代码:-
struct fontSizeConstant{
static let relativeFontConstant : CGFloat = 0.015
static let bigFontConst : CGFloat = 0.050
static let lessBigFontConst : CGFloat = 0.040
static let mediumFontConst : CGFloat = 0.030
}
userName.font = userName.font?.withSize(self.view.frame.height * fontSizeConstant.mediumFontConst)
password.font = password.font?.withSize(self.view.frame.height * fontSizeConstant.mediumFontConst)
loginButton.titleLabel?.font = loginButton.titleLabel?.font.withSize(self.view.frame.height * fontSizeConstant.lessBigFontConst)
答案 2 :(得分:0)