在iOS中加载xib时会调用API吗?

Posted

技术标签:

【中文标题】在iOS中加载xib时会调用API吗?【英文标题】:Will call API when load xib in iOS? 【发布时间】:2016-03-01 02:41:08 【问题描述】:

当我打开一个 xib 文件作为源代码时,我发现一些代码如下:

<fontDescription key="fontDescription" type="system" pointSize="16"/>

当这个xib文件加载时,会调用UIFont API吗?

【问题讨论】:

为什么要问这个?只是好奇。 我希望在加载 xib 文件时进行一些调整。喜欢在 5.5 英寸 iPhone 上显示时增加 fontSize 如果它调用 UIFont API 为什么不增加标签字体大小awakeFromNib 呢?增加字体大小似乎是一种奇怪的方式 您可能不需要将 XIB / Storyboard 视为源代码。没有必要这样做。 如果它调用 UIFont API,我可以在运行时更改方法。而且会节省很多代码。 【参考方案1】:

是的,它调用 UIFont API。我对此进行了测试:

//
//  UIFont+Swizzled.m
//  Test
//
//  Created by Brandon T on 2016-02-29.
//  Copyright © 2016 Test. All rights reserved.
//

#import "UIFont+Swizzled.h"
#import <objc/runtime.h>

@implementation UIFont (Swizzled)

+ (void)load 
    //Quick and dirty swizzle. Should really only run once and check if method is added.. but w/e..

    Method original, swizzled;

    original = class_getClassMethod(self, @selector(fontWithName:size:));
    swizzled = class_getClassMethod(self, @selector(fontWithNameX:size:));
    method_exchangeImplementations(original, swizzled);

    original = class_getClassMethod(self, @selector(fontWithSize:));
    swizzled = class_getClassMethod(self, @selector(fontWithSizeX:));
    method_exchangeImplementations(original, swizzled);

    original = class_getClassMethod(self, @selector(systemFontOfSize:));
    swizzled = class_getClassMethod(self, @selector(systemFontOfSizeX:));
    method_exchangeImplementations(original, swizzled);

    original = class_getClassMethod(self, @selector(fontWithDescriptor:size:));
    swizzled = class_getClassMethod(self, @selector(fontWithDescriptorX:size:));
    method_exchangeImplementations(original, swizzled);


+ (nullable UIFont *)fontWithNameX:(NSString *)fontName size:(CGFloat)fontSize 
    return [self fontWithNameX:fontName size:fontSize];


- (UIFont *)fontWithSizeX:(CGFloat)fontSize 
    return [self fontWithSizeX:fontSize];


+ (UIFont *)systemFontOfSizeX:(CGFloat)fontSize 
    return [self systemFontOfSizeX:fontSize];


+ (UIFont *)fontWithDescriptorX:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize 
    return [self fontWithDescriptorX:descriptor size:pointSize];

@end

然后我创建了一个带有单个控制器的空白故事板,为其添加了一个标签,并将字体更改为 17 号的 Helvetica Neue。

接下来,我将上述类别文件包含到与故事板关联的控制器中。

//
//  ViewController.m
//  Test
//
//  Created by Brandon T on 2016-02-27.
//  Copyright © 2016 Test. All rights reserved.
//

#import "ViewController.h"
#import "UIFont+Swizzled.h"

@interface ViewController ()

@end

@implementation ViewController


- (void)viewDidLoad 
    [super viewDidLoad];


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];


@end

结果:

2016-02-29 22:12:19.585 Test[94691:4139779] systemFontOfSize -- Size:17.000000

2016-02-29 22:12:19.586 Test[94691:4139779] fontWithDescriptor  -- Descriptor: UICTFontDescriptor <0x7fe60340e770> = 
    NSFontNameAttribute = HelveticaNeue;
    NSFontSizeAttribute = 17;
, Size:17.000000

所以它调用了两个东西。 SystemFontOfSize 首先.. 然后它调用FontWithDescriptor

【讨论】:

@OP;不过我必须说..这是一个奇怪的问题..我不知道你为什么需要知道这个.. 我希望在加载 xib 文件时进行一些调整。就像在 5.5 英寸 iPhone 上显示时增加 fontSize。你的回答对我的问题很有帮助!

以上是关于在iOS中加载xib时会调用API吗?的主要内容,如果未能解决你的问题,请参考以下文章

应该停止从 xibs 加载 UIView 吗?

如何在 Store Vuex 中加载 DOM 之前调用 api?

在一个单元格中加载多个 Xib 视图

从bundle中加载xib

无法从包中加载 xib

在uiview中加载xib但没有响应