Пользовательский шрифт в раскадровке?
У меня есть шрифт, добавленный в мой проект iOS. Он в проекте и копируется при создании проекта. Он представляется допустимым шрифтом и будет отображаться, если я перечислю все шрифты на устройстве через приложение. Я правильно настроил plist, чтобы включить шрифт. Кажется, я не могу найти, чтобы найти, чтобы использовать его в текстовых элементах управления, кнопках и т.д. В разделе раскадровки Xcode 4.2. Кроме того, он не позволяет мне набирать имя шрифта, он заставляет меня использовать диалог шрифта. Я также попытался установить этот шрифт в систему, но, похоже, не может показать его в этом списке. Нужно ли это делать только в коде или я могу сделать это через интерфейс раскадровки?
Заметьте, что я могу заставить это работать в коде, но было бы гораздо удобнее сделать это через раскадровку.
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Xcode 6 Interface Builder теперь позволяет выбирать пользовательские шрифты и правильно отображать их во время разработки.
Я знаю, что этот вопрос довольно старый, но я изо всех сил пытался найти простой способ легко указать собственный шрифт в Storyboard (или Interface Builder) для iOS 5, и я нашел довольно удобное решение.
Сначала убедитесь, что вы добавили шрифт в проект, следуя этому руководству. Также помните, что UINavigationBar, UITabBar и UISegmentedControl пользовательских шрифтов могут быть заданы с помощью setTitleTextAttributes:
метод прокси UIAppearance.
Добавьте следующие категории в проект для UIButton, UITextField, UILabel и любого другого компонента, которому требуется собственный шрифт. Категории просто реализуют новое свойство fontName
которое изменяет текущий шрифт элемента, сохраняя размер шрифта.
Чтобы указать шрифт в раскадровке, просто выберите нужный элемент (метка, кнопка, текстовое представление и т.д.) И добавьте пользовательский атрибут времени выполнения с Key Path, для которого установлено значение fontName типа String и значение с именем вашего пользовательского шрифта.
![Custom font Storyboard]()
И что это, вам даже не нужно импортировать категории. Таким образом, вам не нужна розетка для каждого компонента пользовательского интерфейса, для которого требуется собственный шрифт, и вам не нужно кодировать его вручную.
Примите во внимание, что шрифт не будет отображаться в раскадровке, но вы увидите его при запуске на вашем устройстве или симуляторе.
Файлы категорий
UIButton + TCCustomFont.h:
#import <UIKit/UIKit.h>
@interface UIButton (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
UIButton + TCCustomFont.m:
#import "UIButton+TCCustomFont.h"
@implementation UIButton (TCCustomFont)
- (NSString *)fontName {
return self.titleLabel.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}
@end
UILabel + TCCustomFont.h:
#import <UIKit/UIKit.h>
@interface UILabel (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
UILabel + TCCustomFont.m:
#import "UILabel+TCCustomFont.h"
@implementation UILabel (TCCustomFont)
- (NSString *)fontName {
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
UITextField + TCCustomFont.h:
#import <UIKit/UIKit.h>
@interface UITextField (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
UITextField + TCCustomFont.m:
#import "UITextField+TCCustomFont.h"
@implementation UITextField (TCCustomFont)
- (NSString *)fontName {
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
Также можно загрузить из GIST, а также в виде одного файла.
Поиск проблемы
Если вы работаете с ошибками времени выполнения, поскольку свойство fontName
не указано, просто добавьте флаг -all_load
разделе " Другие флаги компоновщика" в настройках проекта, чтобы компоновщик включил категории.
Ответ 2
Из Xcode6.0, как Xcode6.0 release примечание:
Интерфейс Builder отображает встроенные пользовательские шрифты iOS во время разработки, давая более точный просмотр того, как будет выглядеть готовое приложение, с правильными размерами.
вы можете установить шрифт метки в раскадровке. Вы можете выполнить следующие действия
- Получить пользовательский файл шрифта (.ttf,.ttc)
-
Импортируйте файлы шрифтов в проект Xcode
![enter image description here]()
-
В app-info.plist добавьте ключ с именем Шрифты, предоставляемые приложением. Введите тип массива, добавьте все имя файла шрифта в массив, примечание: включая расширение файла.
![enter image description here]()
- В раскадровке перетащите интерфейс UILabel на ваш интерфейс, выберите ярлык и перейдите к Инспектору атрибутов, щелкните по кнопке правой кнопки в области Выбор шрифта. На всплывающей панели выберите Шрифт Пользовательский и выберите Семейство для встраиваемого имени шрифта.
![enter image description here]()
ref to
Ответ 3
Это ошибка в XCode, была там с 3.x и до сих пор не исправлена. Я тоже столкнулся с той же проблемой, даже попробовал добавить ее в свою систему без везения. Вот еще одно сообщение о нем Шрифты, не отображаемые в Interface Builder
Ответ 4
Ответ на Monjer правильный. Если вы, как и я, не видите добавленный шрифт после компиляции, не забудьте добавить шрифт к фазам сборки (цели → фазы сборки → копировать ресурсы пакета → добавить файлы шрифтов)
Ответ 5
redent84 решение было потрясающим!
Я бы просто добавил улучшение, добавив категорию в NSObject, так что вам нужно сделать это только один раз.
NSObject + CustomFont.h
#import <Foundation/Foundation.h>
@interface NSObject (CustomFont)
@property (strong, nonatomic) NSString *fontName;
@property (strong, nonatomic) UIFont *font;
@end
NSObject + CustomFont.m
#import "NSObject+CustomFont.h"
@implementation NSObject (CustomFont)
@dynamic font;
- (NSString *)fontName
{
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName
{
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
Ответ 6
Ни один из них не работал у меня, но это произошло.
#import <UIKit/UIKit.h>
@interface UILabelEx : UILabel
@end
#import "UILabelEx.h"
#import "Constants.h"
@implementation UILabelEx
- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
[super traitCollectionDidChange: previousTraitCollection];
self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];
}
@end
Ответ 7
Начиная с XCode 9.4, XCode по-прежнему не поддерживает шрифты непосредственно в раскадровке. Вы можете увидеть их во время разработки, но не во время выполнения. Если вы используете fontWithName API, вы узнаете, что он возвращает nil, но при использовании в storyboard/xib нет способа узнать, почему он не появляется.
-
Единственный способ убедиться, что он работает легко из Storyboard/XIB во время выполнения, - это добавить .ttc/.ttf в фазу сборки Copy Bundle Resources
.
-
Начиная с 9.4, добавление имен файлов шрифтов в info.plist больше не является обязательным требованием.