首页 文章

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

提问于
浏览
16

在iOS 8中,我们可以为每个尺寸类设计不同的UI布局 . 我面临的问题是,我设计了一个紧凑宽度和常规高度的布局(纵向所有iPhone的尺寸等级),但我想保持3.5和4英寸设备的标签字体较小(iPhone 4和5 ),然后相对较大的4.7英寸(iPhone 6)和更大的5.5英寸(iPhone 6 Plus)设备 . 我已搜索但无法找到解决方案为同一大小类中的不同设备设置不同的字体大小 .

7 回答

  • 3

    Edit :当新设备问世时,我不能很好地扩展 . 使用动态字体大小和特定于大小类的字体的组合 .


    假设有一个新的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)
    }
    
  • 24

    我正在使用UILabel Custom类,UILabel扩展和UIDevice扩展作为通用解决方案在 Swift 3+ 中的项目中处理它 .

    获取 screenType 的UIDevice扩展:

    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
            }
        }
    
    }
    

    以下是使用 screenType 调整字体大小的UILabel扩展 . 也可以在UILabel自定义类中添加 adjustsFontSizeToFitDevice 方法,但我已将其放在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)
            }
        }
    
    }
    

    最后是一个UILabel自定义类,用于将字体调整应用于从 MyCustomLabel 中细分的所有标签 .

    class MyCustomLabel: UILabel {
    
        // MARK: - Life Cycle Methods
    
        override func awakeFromNib() {
            super.awakeFromNib()
    
            adjustsFontSizeToFitDevice()
        }
    
    }
    

    Usage: 在Storyboard中,子类来自 MyCustomLabel 的所有UILabel实例,其字体大小需要根据设备大小进行调整 .

  • 4

    You can achieve desired effect as below.

    Usage : 而不是使用14作为字体大小 you can use 14.fontSize ,它将根据设备更改,取决于您的delta值 .

    无需在代码中添加条件 . 只有一次如下 .

    用法: UIFont.font_medium(12.fontSize)

    UIFont extension:

    extension UIFont {    
        class func font_medium(_ size : CGFloat) -> UIFont {
            return UIFont(name: "EncodeSans-Medium", size: size)!;
        }    
    }
    

    UIDevice Extension:

    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
            }
        }
    }
    

    Int Extension:

    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;
        }
    }
    
  • 13

    两种方式:

    1)在app delegate中手动创建一个方法,共享它的对象和调用方法 .

    例如:

    var device = UIDevice.currentDevice().model
    
        if (device == "iPhone" || device == "iPhone Simulator" || device == "iPod touch")
            {
                labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width, 1)
                labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height-10, self.usernameTF.frame.width,1)
            }
        else
            {
                labelboarder.frame = CGRectMake(0,self.usernameTF.frame.height, 500, 1)
                labelboarder1.frame = CGRectMake(0,self.usernameTF.frame.height, 500,1)
            }
    

    2)在每个UI项目上,转到属性检查器,声明一个字体 .

    (字体大小字段左侧有一个符号可见 . 单击它,选择匹配的大小类并声明字体大小 . )

    第二种选择对我来说很方便 . 快乐的编码!

  • 0

    不是为每个标签编写代码,而是按照以下方式执行 extend your label class with Your custom label class ,它将根据设备分辨率比例因子自动缩放:

    #define  SCALE_FACTOR_H ( [UIScreen mainScreen].bounds.size.height / 568 )
    
    
    CustomLabel.h
    
    #import <UIKit/UIKit.h>
    
    @interface CustomLabel : UILabel
    
    @end
    
    
    CustomLabel.m
    #import "CustomLabel.h"
    
    @implementation CustomLabel
    
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect {
        // Drawing code
    }
    */
    - (id)initWithCoder:(NSCoder *)aDecoder {
        if( (self = [super initWithCoder:aDecoder]) ){
            [self layoutIfNeeded];
            [self configurefont];
        }
        return self;
    }
    
    - (void) configurefont {
        CGFloat newFontSize = (self.font.pointSize * SCALE_FACTOR_H);
        self.font = [UIFont fontWithName:self.font.fontName size:newFontSize];
    }
    @end
    
  • 0

    这就是我做的方式 . 它写在 Swift 4 :)

    enum DeviceSize {
        case big, medium, small
    }
    
    protocol Fontadjustable {
    
        var devicetype: DeviceSize { get }
    
        func adjustFontSizeForDevice()
    }
    
    extension UILabel: Fontadjustable {
    
        var devicetype: DeviceSize {
            switch UIScreen.main.nativeBounds.height {
            case 1136:
                return .small
            case 1334:
                return .medium
            case 2208:
                return .big
            case 2436:
                return .big
            default:
                return .big
            }
        }
    
        func adjustFontSizeForDevice() {
            switch self.devicetype {
            case .small:
                self.font = font.withSize(font.pointSize)
            case .medium:
                self.font = font.withSize(font.pointSize + 5)
            case .big:
                self.font = font.withSize(font.pointSize + 10)
            }
        }
    }
    

    用法: myawesomeLabel.adjustFontSizeForDevice()

  • 1

    像这样创建,

    #define VIEWHEIGHT       ([[UIScreen mainScreen] bounds].size.height)
    #define VIEWWIDTH        ([[UIScreen mainScreen] bounds].size.width)
    #define FONTNAME_LIGHT   @"AppleSDGothicNeo-Regular"
    #define FONTNAME_BOLD    @"AppleSDGothicNeo-Bold"
    #define LFONT_16         [UIFont fontWithName:FONTNAME_LIGHT size:16]
    

    在那之后你想要改变标签字体,我们可以编写简单的Switch case

    switch ((VIEWHEIGHT == 568)?1:((VIEWHEIGHT == 667)?2:3)) {
        case 1:{
            boldFont = BFONT_16;
        }
            break;
        case 2:{
            privacyFont = LFONT_18;
            boldFont = BFONT_18;
        }
            break;
        default:{
            privacyFont = LFONT_20;
            boldFont = BFONT_20;
        }
            break;
    }
    
    Swift Version
    
    func isPhoneDevice() -> Bool {
        return UIDevice.current.userInterfaceIdiom == .phone
    }
    
    func isDeviceiPad() -> Bool {
        return UIDevice.current.userInterfaceIdiom == .pad
    }
    
    func isPadProDevice() -> Bool {
        let SCREEN_WIDTH = Float(UIScreen.main.bounds.size.width)
        let SCREEN_HEIGHT = Float(UIScreen.main.bounds.size.height)
        let SCREEN_MAX_LENGTH: Float = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
    
        return UIDevice.current.userInterfaceIdiom == .pad && SCREEN_MAX_LENGTH == 1366.0
    }
    
    func isPhoneXandXSDevice() -> Bool {
        let SCREEN_WIDTH = CGFloat(UIScreen.main.bounds.size.width)
        let SCREEN_HEIGHT = CGFloat(UIScreen.main.bounds.size.height)
        let SCREEN_MAX_LENGTH: CGFloat = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
    
        return UIDevice.current.userInterfaceIdiom == .phone && SCREEN_MAX_LENGTH == 812.0
    }
    
    func isPhoneXSMaxandXRDevice() -> Bool {
        let SCREEN_WIDTH = CGFloat(UIScreen.main.bounds.size.width)
        let SCREEN_HEIGHT = CGFloat(UIScreen.main.bounds.size.height)
        let SCREEN_MAX_LENGTH: CGFloat = fmax(SCREEN_WIDTH, SCREEN_HEIGHT)
    
        return UIDevice.current.userInterfaceIdiom == .phone && SCREEN_MAX_LENGTH == 896.0
    }
    

相关问题