Использование пользовательских шрифтов в построителе интерфейса
Я искал этот сайт, но я только что нашел неотвеченные вопросы.
Я загрузил пользовательский шрифт в свой проект xcode. A [UIFont fontWithName:@"Laconic-Light" size:19]
работает. Но конструктор интерфейса не любит шрифт. Я не могу использовать его с IB, он всегда показывает шрифт по умолчанию. Есть ли способ рассказать IB, что его нормально использовать шрифт?
Ответы
Ответ 1
У меня также есть эта проблема в Xcode 4. В моей программе есть много UILabel
, у которых нет IBOutlets
, поэтому я делаю так:
Сначала подкласс UILabel
to CustomFontLabel
Затем переопределите метод <<24 >
@implementation CustomFontLabel
- (void)awakeFromNib {
[super awakeFromNib];
self.font = [UIFont fontWithName:@"CustomFontName" size:self.font.pointSize];
}
@end
Наконец, в Interface Builder > Identity Inspector измените класс на CustomFontLabel
.
Ответ 2
Другим решением будет подкласс UILabel для загрузки в пользовательский шрифт. Затем вы можете ссылаться на него в IB, хотя вы по-прежнему не можете видеть правильный шрифт.
Ответ 3
Я предпочитаю делать это несколько более общим образом, что позволяет вам размер текста в Interface Builder и просто заменять шрифты во время выполнения.
Я создаю свойство IBCollection для любых элементов UIKit для установки шрифта, а затем подключаю соответствующие элементы из IB.
@property (strong, nonatomic) IBOutletCollection(id) NSArray *lightFontItems;
@property (strong, nonatomic) IBOutletCollection(id) NSArray *regularFontItems;
Тогда, на мой взгляд, загрузился я использую такой метод:
[self setFontName:@"Roboto-Light" onItemsInArray:[self lightFontItems]];
[self setFontName:@"Roboto-Regular" onItemsInArray:[self regularFontItems]];
И метод setLightFontOnItemsInArray:
выглядит следующим образом:
+ (void)setFontName:(NSString *)fontName onItemsInArray:(NSArray *)array;
{
[array each:^(id item) {
if (![item respondsToSelector:@selector(setFont:)]) return;
[item performSelector:@selector(setFont:) withObject:[UIFont fontWithName:fontName size:[[item font] pointSize]]];
}];
}
Ответ 4
Вы можете установить этот script http://pitaya.ch/moarfonts/.
Хорошо работает для меня с xcode 5.1.1.
Ответ 5
Благодаря яблоку, в Xcode 6, у нас есть пользовательские шрифты, доступные в самом интерфейсе.
- Добавить файл шрифта .ttf в ваш пакет
- Добавить имя шрифта в файл .plist.
- Перейдите в файл xib/раскадровки, вы можете увидеть свой шрифт.
![введите описание изображения здесь]()
Ответ 6
Swizzle a Font
Решение, как правило, является простым, если вы подбираете класс UIFont. Я думаю, что лучше всего выбрать здравый шрифт, такой как Helvetica Neue, и переопределить это. Это позволяет вернуть весь проект в стандарт, потянув за отображение. Я уже придумал swizzle для достижения этой цели, когда я понял, что кто-то еще сделал это, поэтому я немного помял его. Поскольку NSHipster скажет, что swizzling может быть опасным, но в этом случае риск довольно низкий, учитывая абсолютную простоту API UIFont. В моем случае это было сделано для корпоративного приложения, так что это был даже более низкий риск.
UIFont + CustomFont.m Категория
#import <objc/runtime.h>
static NSString *const kFontMapPlist = @"FontMap";
static NSDictionary *_replacementFontDictionary = nil;
@implementation UIFont (CustomFont)
static void initializeReplacementFonts()
{
static BOOL initialized = NO;
if (initialized)
return;
initialized = YES;
// A Plist with a Dictionary from->to font name mapping
NSURL *replacementFontMapURL = [[NSBundle mainBundle] URLForResource:kFontMapPlist withExtension:@"plist"];
NSDictionary *replacementFontMap = [NSDictionary dictionaryWithContentsOfURL:replacementFontMapURL];
[UIFont setReplacementFontDictionary:replacementFontMap];
}
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
initializeReplacementFonts();
SEL fontWithNameSizeSelector = @selector(fontWithName:size:);
SEL swizzledFontWithNameSizeSelector = @selector(clp_fontWithName:size:);
SwizzleClassMethod([UIFont class], fontWithNameSizeSelector, swizzledFontWithNameSizeSelector);
SEL fontWithDescriptorSizeSelector = @selector(fontWithDescriptor:size:);
SEL swizzledfontWithDescriptorSelector = @selector(clp_fontWithDescriptor:size:);
SwizzleClassMethod([UIFont class], fontWithDescriptorSizeSelector, swizzledfontWithDescriptorSelector);
});
}
void SwizzleClassMethod(Class class, SEL originalSelector, SEL replacementSelector)
{
Class clazz = objc_getMetaClass(class_getName(class));
Method originalMethod = class_getClassMethod(clazz, originalSelector);
Method replacementMethod = class_getClassMethod(clazz, replacementSelector);
// Add method if it doesn't eixst
BOOL didAddMethod =
class_addMethod(clazz,
originalSelector,
method_getImplementation(replacementMethod),
method_getTypeEncoding(replacementMethod));
if (didAddMethod) {
class_replaceMethod(clazz,
replacementSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, replacementMethod);
}
}
#pragma mark - Swizzled font by descriptor and name calls
+ (UIFont *)clp_fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize
{
NSString *originalFontName = descriptor.fontAttributes[UIFontDescriptorNameAttribute];
NSString *replacementFontName = _replacementFontDictionary[originalFontName];
UIFontDescriptor *replacementFontDescriptor = descriptor;
if (replacementFontName != nil) {
replacementFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{UIFontDescriptorNameAttribute: replacementFontName}];
}
return [self clp_fontWithDescriptor:replacementFontDescriptor size:pointSize];
}
+ (UIFont *)clp_fontWithName:(NSString *)fontName size:(CGFloat)fontSize
{
NSString *replacementFontName = _replacementFontDictionary[fontName];
if (replacementFontName == nil) {
replacementFontName = fontName;
}
return [self clp_fontWithName:replacementFontName size:fontSize];
}
#pragma mark - Replacement Dictionary Getter and Setter
+ (NSDictionary *)replacementDictionary
{
return _replacementFontDictionary;
}
+ (void)setReplacementFontDictionary:(NSDictionary *)replacmentFontDictionary
{
if (replacmentFontDictionary == _replacementFontDictionary) {
return;
}
_replacementFontDictionary = replacmentFontDictionary;
// Validate font existence.
for (NSString *originalFontName in [_replacementFontDictionary allKeys]) {
NSString *replacementFontName = [_replacementFontDictionary objectForKey:originalFontName];
UIFont *replacementFont = [UIFont fontWithName:replacementFontName size:10.0f];
if (replacementFont == nil) {
DDLogError(@"WARNING: replacement font '%@' is not available.", replacementFontName);
}
}
}
@end
FontMap.plist
Для простоты сделаем вид, что у нас есть шрифт CustomSans.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>HelveticaNeue-Light</key>
<string>CustomSans-Light</string>
<key>HelveticaNeue-LightItalic</key>
<string>CustomSans-LightItalic</string>
<key>HelveticaNeue-Bold</key>
<string>CustomSans-Bold</string>
<key>HelveticaNeue-BoldItalic</key>
<string>CustomSans-BoldItalic</string>
</dict>
</plist>