不同设备的单一尺寸类别中的iOS不同字体大小

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其字体大小需要根据设备大小进行调整.


Hit*_*nki 5

您可以实现如下所需的效果。

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)