2016-05-27 65 views
1

我使用以下代碼覆蓋了我應用程序中的所有字體。我花了幾個小時才弄明白這一點,但字體被覆蓋,正常功能會中斷(例如:UITableViewCell上的長按手勢),並且UIBarButtonItem的所有實例都被截斷,導航欄中只顯示...重寫UIFonts時__NSPlaceholderDictionary崩潰

崩潰總是導致

*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是:「* - [__ NSPlaceholderDictionary initWithObjects:forKeys:數:]:嘗試從物體插入零對象[0]」

//.h 
@interface UIFont (SystemFontOverride) 
@end 

//.m 
@implementation UIFont (SystemFontOverride) 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize { 
    return [UIFont fontWithName:@"HelveticaNeue-Regular" size:fontSize]; 
} 

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize { 
    return [UIFont fontWithName:@"HelveticaNeue-Thin" size:fontSize]; 
} 

+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize { 
    return [UIFont fontWithName:@"HelveticaNeue-ThinItalic" size:fontSize]; 
} 
#pragma clang diagnostic pop 

@end 

我做錯了什麼?有沒有更好的方式來覆蓋字體,而無需手動設置每個標籤,細分控制等......這個應用程序不會在應用程序商店,所以我打開任何建議。

獎勵問題,#pragma clang diagnostic pop#pragma clang diagnostic push。我瞭解它保存編譯器的狀態,靜默警告,然後恢復狀態。我可以離開只是#pragma clang diagnostic ignored

+1

永不覆蓋方法在Objective-C類別中。這是未定義的行爲,並導致不好的事情發生。 – rmaddy

+0

有關如何更改我所有字體的任何建議。使用UI_APPEARENCE修飾,但缺點是不是所有我的標籤都是相同的字體大小,我不能改變字體,沒有指定大小 – Multinerd

+1

而不是嘗試替換類別中的標準'UIFont'方法,將自己的方法添加到類別。示例 - 不是重寫'boldSystemFontOfSize:',而是將其命名爲'myBoldSystemFontOfSize:'。或者使用'UI_APPEARANCE'或使用'label.font = [label.font fontWithSize:newSize];'更改標籤的字體大小。 – rmaddy

回答

0

取代的UILabel爲紀念這一着想作爲回答,即時跟隨rmaddy的評論

而不是試圖在一個類別中替換標準的UIFont方法,添加您的自己的方法的類別。示例 - 而不是重寫boldSystemFontOfSize:,將其命名爲myBoldSystemFontOfSize :.或者使用UI_APPEARANCE或使用label.font = [label.font fontWithSize:newSize]更改標籤的字體大小;

我去UI_APPEARANCE路線

[[UILabel appearance] setFont:[UIFont fontWithName:fontName size:fontSize]]; 

如果您的標籤需要不同的字體大小,這可能是有問題的,幸運的是,標籤我需要改變都是相同的字號

0

你也可以繼承的UILabel,並在任何地方使用它:

對於在init方法示例調用setfont程序,

然後只需找到&與子類