Mav*_*ick 17 font-size ios autolayout size-classes
在iOS 8中,我们可以为每个尺寸类设计不同的UI布局.我面临的问题是,我设计了一个紧凑宽度和常规高度的布局(纵向所有iPhone的尺寸等级),但我想保持3.5和4英寸设备的标签字体较小(iPhone 4和5 ),然后相对较大的4.7英寸(iPhone 6)和更大的5.5英寸(iPhone 6 Plus)设备.我已搜索但无法找到解决方案为同一大小类中的不同设备设置不同的字体大小.
Ces*_*are 24
编辑:我不再推荐这个了.当新设备出现时,这种方法不能很好地扩展.使用动态字体大小和特定于大小类的字体的组合.
假设有一个新的iPhone型号出现,如果您使用自动布局和大小类,则不必手动修复所有约束以使您的应用与此新设备兼容.但是,您仍然可以UILabel使用以下代码设置字体大小:
if UIScreen.mainScreen().bounds.size.height == 480 {
// iPhone 4
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.height == 568 {
// IPhone 5
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 375 {
// iPhone 6
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 414 {
// iPhone 6+
label.font = label.font.fontWithSize(20)
} else if UIScreen.mainScreen().bounds.size.width == 768 {
// iPad
label.font = label.font.fontWithSize(20)
}
Run Code Online (Sandbox Code Playgroud)
Mav*_*ick 13
我正在使用UILabel Custom类,UILabel扩展和UIDevice扩展作为通用解决方案在Swift 3+的项目中处理它.
获取UIDevice扩展screenType:
public extension UIDevice {
var iPhone: Bool {
return UIDevice().userInterfaceIdiom == .phone
}
enum ScreenType: String {
case iPhone4
case iPhone5
case iPhone6
case iPhone6Plus
case iPhoneX
case Unknown
}
var screenType: ScreenType {
guard iPhone else { return .Unknown}
switch UIScreen.main.nativeBounds.height {
case 960:
return .iPhone4
case 1136:
return .iPhone5
case 1334:
return .iPhone6
case 2208:
return .iPhone6Plus
case 2436:
return .iPhoneX
default:
return .Unknown
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是的UILabel扩展使用screenType,以调整字体大小.adjustsFontSizeToFitDevice方法也可以添加到UILabel自定义类中,但是我已将它放在UILabel扩展中,以便可以从所有类型的UILabel实例访问它.
adjustsFontSizeToFitDevice方法中使用的常数"2" 可以更改为任何所需的数字.我的逻辑是将iPhone 6/7/8视为默认分辨率,并为该分辨率的每个标签提供合适的字体大小(在故事板中).然后,我为iPhone X和iPhone 6/7/8 Plus增加了2分,而为iPhone 4/5减去了2分.
extension UILabel {
func adjustsFontSizeToFitDevice() {
switch UIDevice().screenType {
case .iPhone4, .iPhone5:
font = font.withSize(font.pointSize - 2)
break
case .iPhone6Plus, .iPhoneX:
font = font.withSize(font.pointSize + 2)
break
default:
font = font.withSize(font.pointSize)
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后是一个UILabel自定义类,用于将字体调整应用于所有子类的标签MyCustomLabel.
class MyCustomLabel: UILabel {
// MARK: - Life Cycle Methods
override func awakeFromNib() {
super.awakeFromNib()
adjustsFontSizeToFitDevice()
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
在Storyboard中,子类所有UILabel实例,MyCustomLabel其字体大小需要根据设备大小进行调整.
您可以实现如下所需的效果。
Usage : 而不是使用 14 作为 您可以使用的14.fontSize字体大小,它会根据设备而改变,取决于您的增量值。
无需在代码中的每一处添加条件。只有一次如下。
用法: UIFont.font_medium(12.fontSize)
UIFont 扩展:
extension UIFont {
class func font_medium(_ size : CGFloat) -> UIFont {
return UIFont(name: "EncodeSans-Medium", size: size)!;
}
}
Run Code Online (Sandbox Code Playgroud)
UIDevice 扩展:
extension UIDevice {
enum DeviceTypes {
case iPhone4_4s
case iPhone5_5s
case iPhone6_6s
case iPhone6p_6ps
case after_iPhone6p_6ps
}
static var deviceType : DeviceTypes {
switch UIScreen.main.height {
case 480.0:
return .iPhone4_4s
case 568.0:
return .iPhone5_5s
case 667.0:
return .iPhone6_6s
case 736.0:
return .iPhone6p_6ps
default:
return .after_iPhone6p_6ps
}
}
}
Run Code Online (Sandbox Code Playgroud)
内部扩展:
extension Int{
var fontSize : CGFloat {
var deltaSize : CGFloat = 0;
switch (UIDevice.deviceType) {
case .iPhone4_4s,
.iPhone5_5s :
deltaSize = -1;
case .iPhone6_6s :
deltaSize = 2;
case .iPhone6p_6ps :
deltaSize = 2;
default:
deltaSize = 0;
}
let selfValue = self;
return CGFloat(selfValue) + deltaSize;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14488 次 |
| 最近记录: |