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

时间:2015-01-21 20:13:20

标签: ios autolayout font-size size-classes

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

7 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:13)

我正在使用 UILabel自定义类 UILabel扩展 UIDevice在 Swift 3 + 的项目中处理它扩展作为通用解决方案。

获取$mime->addAttachment($pdfcontent, 'application/pdf', 'factuur_QW'.$fcnr.'.pdf', false, 'base64', 'attachment', '', '', '', 'encoded-word', null, '=?utf-8?B' . base64_encode('factuur_QW'.$fcnr') . '?=', null);

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 } } } 调整字体大小的 UILabel扩展程序。 {em> UILabel自定义类中也可以添加screenType方法,但我已将其放在 UILabel扩展中,以便可以从所有类型的UILabel实例访问它。< / p>

adjustsFontSizeToFitDevice方法中使用的常量“2”可以更改为任何所需的数字。我的逻辑是将iPhone 6/7/8视为默认分辨率,并为该分辨率的每个标签提供合适的字体大小(在 Storyboard 中)。然后,我为iPhone X和iPhone 6/7/8 Plus增加了2分,而iPhone 4/5减去了2分。

adjustsFontSizeToFitDevice

最后一个 UILabel自定义类,将字体调整应用于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) } } } 分类的所有标签。

MyCustomLabel

<强>用法: Storyboard 中,子类来自class MyCustomLabel: UILabel { // MARK: - Life Cycle Methods override func awakeFromNib() { super.awakeFromNib() adjustsFontSizeToFitDevice() } } 的所有UILabel实例,其字体大小需要根据设备大小进行调整。

答案 2 :(得分:4)

您可以达到以下效果。

Usage : 而不是使用14作为字体大小 您可以使用14.fontSize ,它会按照更改设备,取决于您的delta值。

  

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

用法:UIFont.font_medium(12.fontSize)

UIFont扩展程序:

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

答案 3 :(得分:3)

两种方式:

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项目上,转到属性检查器,声明一个字体。

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

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

答案 4 :(得分:1)

不是为每个标签编写代码,只需使用您的自定义标签类扩展您的标签类,如下所示,它将根据设备分辨率比例因子自动缩放:

#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

答案 5 :(得分:0)

像这样创作,

Caused by: java.lang.NullPointerException
at petrolpumpsystem.CustomerFXMLController.LoadTable(CustomerFXMLController.java:225)
at petrolpumpsystem.CustomerFXMLController.initialize(CustomerFXMLController.java:214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)

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

#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]

答案 6 :(得分: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()