Я хотів би, щоб програма включала в себе спеціальний шрифт для візуалізації тексту, завантажувала його, а потім використовувала його зі стандартними UIKit
елементами, такими як UILabel
. Чи можливо це?
Я хотів би, щоб програма включала в себе спеціальний шрифт для візуалізації тексту, завантажувала його, а потім використовувала його зі стандартними UIKit
елементами, такими як UILabel
. Чи можливо це?
Відповіді:
iOS 3.2 та пізніші версії цього підтримують. Прямо з нового в iPhone OS 3.2 doc:
Програми підтримки користувальницьких шрифтів, які хочуть використовувати спеціальні шрифти, тепер можуть включати ці шрифти у свій пакет програм та реєструвати ці шрифти в системі, включивши ключ UIAppFonts у свій файл Info.plist. Значення цього ключа - це масив рядків, що ідентифікують файли шрифтів у пакеті програми. Коли система бачить ключ, він завантажує вказані шрифти та робить їх доступними для програми.
Після того, як шрифти встановлені в Info.plist
, ви можете використовувати власні шрифти як будь-який інший шрифт у IB або програмно.
На Форумах розробників Apple триває нитка:
https://devforums.apple.com/thread/37824 (необхідний вхід)
Ось чудовий і простий підручник з 3 кроків про те, як цього досягти (розірване посилання видалено)
Info.plist
файлу, який називається UIAppFonts
.UIAppFonts
масивуInfo.plist
[UIFont fontWithName:@"CustomFontName" size:12]
щоб отримати спеціальний шрифт для використання у своїх UILabels та UITextViews тощо.Також: Переконайтеся, що шрифти містяться у ваших ресурсах Copy Bundle.
Редагувати: Станом на iOS 3.2, ця функціональність вбудована. Якщо вам потрібно підтримати попередній 3.2, ви все одно можете використовувати це рішення.
Я створив простий модуль, який розширює UILabel
та обробляє завантаження файлів .ttf. Я випустив його з відкритим кодом під ліцензією Apache і поставив його на github Here.
Важливими файлами є FontLabel.h
і FontLabel.m
.
Він використовує частину коду з відповіді Genericrich .
Тут перегляньте джерело .
АБО
Скопіюйте файл шрифту в ресурси
Додайте ключ до свого Info.plist
файлу під назвою UIAppFonts. ("Шрифти, надані додатком)
Зробіть цей ключ масивом
Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до масиву UIAppFonts
Зберегти Info.plist
Тепер у вашій програмі ви можете просто зателефонувати, [UIFont fontWithName:@"CustomFontName" size:15]
щоб отримати спеціальний шрифт, який можна використовувати разом із вашим UILabels
і UITextViews
т. Д.…
Існує простий спосіб використання користувацьких шрифтів в iOS 4 .
Chalkduster.ttf
) у папку " Ресурси " проекту в XCode.info.plist
і додайте новий ключ, який називається UIAppFonts
. Тип цього ключа повинен бути масивом.Chalkduster.ttf
).[UIFont fontWithName:@"Chalkduster" size:16]
у своїй програмі.На жаль, IB не дозволяє ініціалізувати мітки зі спеціальними шрифтами. Дивіться це питання, щоб вирішити цю проблему. Моє улюблене рішення - використовувати спеціальний UILabel
підклас:
@implementation CustomFontLabel
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder: decoder])
{
[self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
}
return self;
}
@end
У Info.plist додайте запис "Шрифти, надані програмою" та додайте назви шрифтів у вигляді рядків:
Fonts provided by application
Item 0 myfontname.ttf
Item 1 myfontname-bold.ttf
...
Потім перевірте, чи не включено ваш шрифт, запустивши:
for (NSString *familyName in [UIFont familyNames]) {
for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
NSLog(@"%@", fontName);
}
}
Зауважте, що ваше ім'я файлу ttf може бути не тим самим іменем, яке ви використовуєте під час встановлення шрифту для вашої мітки (ви можете скористатися кодом вище, щоб отримати параметр "fontWithName"):
[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
редагувати: Ця відповідь не використовується на iOS3.2; використовувати UIAppFonts
Єдиний спосіб, коли мені вдалося успішно завантажити користувальницьку систему UIFont
, - це через приватну структуру GraphicsServices.
Далі буде завантажено всі .ttf
шрифти в основний пакет програми:
BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
NSUInteger newFontCount = 0;
for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
newFontCount += GSFontAddFromFile([fontFile UTF8String]);
return newFontCount;
}
Після завантаження шрифтів їх можна використовувати так само, як і шрифти, надані Apple:
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];
GraphicsServices можна навіть завантажувати під час виконання, якщо API зникне в майбутньому:
#import <dlfcn.h>
NSUInteger loadFonts()
{
NSUInteger newFontCount = 0;
NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
if (frameworkPath) {
void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
if (graphicsServices) {
BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
if (GSFontAddFromFile)
for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
newFontCount += GSFontAddFromFile([fontFile UTF8String]);
}
}
return newFontCount;
}
[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
для будь-яких спеціальних шрифтів повертається 0 ширини та висоти.
За допомогою iOS 8
+ і Xcode 6
+ ви можете це легко зробити. Ось такі кроки:
1) Перетягніть шрифт у Xcode
папку Підтримуючі файли. Не забудьте позначити додаток у розділі Додати до цілей . З цього моменту ви можете використовувати цей шрифт IB
і вибирати його з палітри шрифту.
2) Щоб зробити цей шрифт доступним у вашому пристрої, відкрийте свій info.plist
і додайте Fonts provided by application
ключ. Він буде містити ключ Item 0, ви повинні додати ім'я шрифту як значення. Назва шрифту може відрізнятися від імені вашого шрифту. Але спочатку спробуйте додати своє ім’я файлу у більшості випадків це робота.
Якщо ні, то ця стаття мені завжди допомагала.
Ось швидкий фрагмент коду з цієї статті, який допоможе вам знайти ім’я шрифту.
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
Хочу зазначити, що вам потрібно додати файли шрифтів у фази збирання цілі , скопіювати ресурси ресурсу . Без цього ви не побачите свій шрифт на пристрої. І це може призвести до несподіваної поведінки.
Наприклад, я стикаюся з a bug
, коли UITextField
мають спеціальний шрифт, але цей шрифт не був у ресурсах Copy Bundle Copy . І коли я переймаюся viewcontroller
цим textfield
, виникає затримка приблизно на 4 секунди до того, як viewDidLoad
була викликана функція. Вирішення проблем із шрифтом усунуло цю затримку. Тож рекомендуємо перевірити це двічі. (rdar: // 20028250) Btw, я не зміг відтворити помилку, але впевнений, що проблема була з шрифтом.
Я зробив це так:
Завантажте шрифт:
- (void)loadFont{
// Get the path to our custom font and create a data provider.
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
// Create the font with the data provider, then release the data provider.
customFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);
}
Тепер у вашому drawRect:
зробіть щось подібне:
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
// Get the context.
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
// Set the customFont to be the font used to draw.
CGContextSetFont(context, customFont);
// Set how the context draws the font, what color, how big.
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
UIColor * strokeColor = [UIColor blackColor];
CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
CGContextSetFontSize(context, 48.0f);
// Create an array of Glyph's the size of text that will be drawn.
CGGlyph textToPrint[[self.theText length]];
// Loop through the entire length of the text.
for (int i = 0; i < [self.theText length]; ++i) {
// Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
}
CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, textTransform);
CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}
По суті, вам потрібно виконати певну грубу силу, що прокручує текст і хитається з магічним числом, щоб знайти ваше зміщення (тут, див. Мені, використовуючи 29) у шрифті, але це працює.
Крім того, ви повинні переконатися, що шрифт законно вбудовується. Більшість ні, і є адвокати, які спеціалізуються на подібній справі, тому будьте попереджені.
CGContextShowTextAtPoint()
хоча це не працює з UTF-8.
Так, ви можете включити спеціальні шрифти. Зверніться до документації про UIFont, зокрема, про fontWithName:size:
метод.
1) Переконайтеся, що ви включили шрифт у свою папку ресурсів.
2) "Ім'я" шрифту не обов'язково має назву файлу.
3) Переконайтеся, що у вас є законне право на використання цього шрифту. Включивши його у свій додаток, ви також поширюєте його, і вам потрібно мати право на це.
Якщо ви користуєтесь xcode 4.3
, вам потрібно додати значення font
" Build Phase
нижче" Copy Bundle Resources
, відповідно до https://stackoverflow.com/users/1292829/arne у потоці, Спеціальні шрифти Xcode 4.3 . Це працювало для мене. Ось такі кроки, які я вжила для роботи з користувацькими шрифтами в моєму додатку:
OTF
(або TTF
) файли на нову групу, яку створив і прийняв на вибір xcode copying the files over to the project folder
.UIAppFonts
масив зі своїми шрифтами, переліченими як елементи в масиві. Просто names
, а не розширення (наприклад, " GothamBold
", " GothamBold-Italic
").project name
шляху вгорі Project Navigator
на лівій частині екрана.Build Phases
вкладку, що з’являється в основній області xcode.Copy Bundle Resources
" і натисніть, "+"
щоб додати шрифт."+"
.add to the project
.Ось покрокова інструкція, як це зробити. Не потрібна додаткова бібліотека чи якесь спеціальне кодування.
http://shang-liang.com/blog/custom-fonts-in-ios4/
Більшість випадків питання стосується шрифту, а не методу. Найкращий спосіб зробити це - використовувати шрифт, який напевно спрацює, як-от вердана або геогія. Потім перейдіть до призначеного шрифту. Якщо це не працює, можливо, назва шрифту невірна, або шрифт - це не добре сформований шрифт.
Додайте новий шрифт у свій додаток iOS дуже просто.
Вам просто потрібно додати шрифт, наприклад font.ttf, у свою папку ресурсів.
Відкрийте свою заявку info.plist
. Додайте новий рядок як "Шрифти, надані програмою" та введіть назву шрифту як font.ttf.
І при встановленні шрифту робіть так setFont:"corresponding Font Name"
Ви можете перевірити, додано ваш шрифт чи ні NSArray *check = [UIFont familyNames];
.
Він повертає весь шрифт, який підтримує ваша програма.
Я рекомендую дотримуватися одного з моїх улюблених коротких навчальних посібників тут: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/, з якого надходить ця інформація.
Крок 1 - Перетягніть .ttf або .otf з Finder у свій проект
ПРИМІТКА. Переконайтесь, що натисніть поле "Додати до цілей" у вашій головній цілі програми
Якщо ви забули натиснути , щоб додати його до мети , то натисніть на файл шрифту в ієрархії проекту і на правій бічній панелі клацніть головну мету програми в Target Membership розділі
Щоб переконатися, що ваші шрифти є частиною цілі вашої програми, переконайтеся, що вони відображаються у ваших ресурсах копіювання пакетів у фазах збірки
Крок 2 - Додайте імена файлів шрифтів у свій список
Перейдіть до спеціальних властивостей цілі iOS у розділі Інформація та додайте ключ до елементів у цьому розділі під назвою Fonts provided by application
(ви повинні побачити, що він з'являється як опція під час його введення, і він налаштує себе як масив. Клацніть маленьку стрілку щоб відкрити елементи масиву та ввести імена файлів .ttf або .otf, які ви додали, щоб повідомити вашій програмі про те, що це файли шрифтів, які ви хочете отримати
ПРИМІТКА. Якщо ваш додаток виходить з ладу відразу після цього кроку, перевірте написання елементів, які ви додали сюди
Крок 3 - Дізнайтеся назви ваших шрифтів, щоб ви могли їх зателефонувати
Досить часто назва шрифту, що бачиться у вашій програмі, відрізняється від того, що, на вашу думку, засноване на імені файлу цього шрифту, введіть це у свій код і перегляньте журнал, який ваша програма робить, щоб побачити, яке ім'я шрифту викликати у вашому коді
Швидкий
for family: String in UIFont.familyNames(){
print("\(family)")
for names: String in UIFont.fontNamesForFamilyName(family){
print("== \(names)")
}
}
Мета C
for (NSString* family in [UIFont familyNames]){
NSLog(@"%@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family]){
NSLog(@" %@", name);
}
}
Ваш журнал повинен виглядати приблизно так:
Крок 4 - Використовуйте новий спеціальний шрифт, використовуючи ім’я з кроку 3
Швидкий
label.font = UIFont(name: "SourceSansPro-Regular", size: 18)
Мета C
label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
Це ще не вийшло, але наступна версія cocos2d (2d ігровий фреймворк) підтримуватиме шрифти бітових карт різної довжини як карти символів.
http://code.google.com/p/cocos2d-iphone/isissue/detail?id=317
У автора немає прибитої дати випуску для цієї версії, але я побачив публікацію, яка вказувала, що це буде через наступний місяць-два.
Одне важливе зауваження: Ви повинні використовувати "PostScript ім'я", пов'язане з шрифтом, а не його повне ім'я або прізвище. Ця назва часто може відрізнятися від звичайної назви шрифту.
виконайте цей крок
1) Скопіюйте свій шрифт у своєму проекті
2) відкрити .plist
файл у режимі вихідного коду ... (Примітка - Не відкриватиinfo.plist
)
3) Перед цим - клацніть правою кнопкою миші на своєму шрифті та відкрийте його у fontforge чи подібному редакторі та install
його у вашій системі.install
4) Введіть це
<key>UIAppFonts</key>
<array>
<string>MyriadPro.otf</string>
</array>
5) Введіть цей код у своєму class .m
[lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];
Тут lblPoints буде змінено як у вашому UILabel
Готово !! Якщо ваш шрифт все ще не працює, спочатку перевірте сумісність шрифтів
info.plist
?
Можливо, автор забув надати шрифту ім'я Mac FOND ?
Ви також можете спробувати опцію "Apple" у діалоговому вікні експорту.
ВІДМОВА : Я не розробник IPhone!
Я випробовував різні пропозиції на цій сторінці в iOS 3.1.2, і ось мої висновки:
Просто за допомогою [UIFont fontWithName:size:]
шрифтів у каталозі ресурсів не буде працювати, навіть якщо ім'я FOND встановлено за допомогою FontForge.
[UIFont fontWithName:size:]
буде працювати, якщо шрифти завантажуються спочатку за допомогою GSFontAddFromFile. Але GSFontAddFromFile
він не є частиною iOS 3.1.2, тому його потрібно динамічно завантажувати, як описано в @rpetrich.
Подивіться ATSApplicationFontsPath
Простий запис у списку, який дозволяє включати файли шрифтів у папку ресурсів програми, і вони "просто працюють" у вашому додатку.
Деякі поради на цій сторінці я поєднав у щось, що працює для мене на iOS 5.
По-перше, ви повинні додати спеціальний шрифт до свого проекту. Потім вам потрібно дотримуватися порад @iPhoneDev і додати шрифт у файл info.plist.
Після цього це працює:
UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];
Однак вам потрібно знати назву Postcript вашого шрифту. Просто дотримуйтесь порад @Daniel Wood та натисніть команду-i, поки ви знаходитесь у FontBook.
Потім насолоджуйтесь своїм власним шрифтом.
Спочатку додайте шрифт у форматі .odt до ваших ресурсів; в цьому випадку ми будемо використовувати DINEngschriftStd.otf, а потім використовуємо цей код для присвоєння шрифту ярлику
[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];
Щоб переконатися, що ваш шрифт завантажений у проект, просто зателефонуйте
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
У списку .plist ви повинні оголосити шрифт. Просто додайте запис "Шрифти, надані програмою", і додайте рядок 0 із назвою шрифту (DINEngschriftStd.otf)
Для iOS 3.2 та новіших версій: використовуйте наведені вище декілька методів, які є:
[UIFont fontWithName:@"Real Font Name" size:16]
у своїй програмі.АЛЕ "Справжнє ім'я шрифту" - це не завжди те, що ви бачите у Fontbook. Найкращий спосіб запитати у свого пристрою, які шрифти він бачить та які точні назви.
Я використовую uifont-name-grabber, розміщений за адресою: uifont-name-grabber
Просто введіть потрібні шрифти в проект xcode, додайте ім'я файлу до його списку та запустіть його на пристрої, для якого ви будуєте, він надішле вам електронний лист із повним списком шрифтів, використовуючи очікувані імена UIFont fontWithName:
.
Існує новий спосіб використання спеціальних шрифтів, починаючи з iOS 4.1. Це дозволяє динамічно завантажувати шрифти, будь то файли, що входять до програми, завантажені дані чи що у вас є. Він також дозволяє завантажувати шрифти у міру необхідності, тоді як старий метод завантажує їх усі під час запуску програми, що може зайняти занадто багато часу, якщо у вас багато шрифтів.
Новий метод описаний при завантаженні шрифтів ios-dynamic
Ви використовуєте CTFontManagerRegisterGraphicsFont
функцію, надаючи їй буфер із вашими даними про шрифт. Потім він доступний для UIFont
перегляду в Інтернеті, як і колишній метод. Ось зразок коду за цим посиланням:
NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
CFStringRef errorDescription = CFErrorCopyDescription(error)
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
kCTFontManagerErrorAlreadyRegistered
"Файл уже зареєстрований у визначеному обсязі". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
Додайте потрібні шрифти до свого проекту (як і додавання зображень, просто перетягніть на Xcode), переконайтесь, що вони націлені на ваш проект,
додайте цей метод та завантажте власні шрифти (рекомендується в appDelegate didFinishLaunchingWithOptions
)
func loadFont(filePath: String) {
let fontData = NSData(contentsOfFile: filePath)!
let dataProvider = CGDataProviderCreateWithCFData(fontData)
let cgFont = CGFontCreateWithDataProvider(dataProvider)!
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
print("Unable to load font: %@", errorDescription, terminator: "")
}
}
Приклад використання:
if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
loadFont(fontPath)
}
Використовуйте шрифт:
UIFont(name: "My-Font", size: 16.5)
Хоча деякі відповіді вище є правильними, я написав докладний наочний посібник для людей, які все ще мають проблеми з шрифтами.
Розв’язання, над якими вказано, можна додати шрифт до списку та використовувати
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
є правильними. Будь ласка, використовуйте будь-який інший хакерський спосіб. Якщо у вас все ще виникають проблеми з пошуком імен шрифту та додаванням їх, ось підручник -
так, ви можете використовувати спеціальний шрифт у вашій програмі
Крок за кроком слідуючи там:
Додайте власні файли шрифтів у свій проект у підтримуючі файли
Додайте ключ до файлу Info.plist під назвою UIAppFonts.
Зробіть цей ключ масивом
Для кожного наявного шрифту введіть повне ім'я файлу шрифту (включаючи розширення) як елементи до масиву UIAppFonts
Збережіть Info.plist Тепер у вашій програмі ви можете просто зателефонувати [UIFont fontWithName: @ "Ваше власне ім'я шрифту" розмір: 20], щоб отримати спеціальний шрифт, який слід використовувати з вашими UILabels після застосування цього, якщо ваш неправильний шрифт не виходить, то двічі клацніть на спеціальному шрифті, і уважно перегляньте назву шрифту верхньої сторони та скопіюйте цей шрифт, вставте сюди [UIFont fontWithName: @ "тут минуло власне ім'я шрифту" розмір: 20]
Я сподіваюся, що ви отримаєте правильну відповідь
так, ви можете використовувати спеціальний шрифт у вашій програмі
Крок за кроком слідуючи там:
Info.plist
файлу під назвою UIAppFonts.Info.plist
зараз у вашій програмі ви можете просто зателефонувати, [UIFont fontWithName:@"your Custom font Name" size:20]
щоб отримати спеціальний шрифт, який можна використовувати з вашимUILabels
після цього застосуйте, якщо ваш неправильний шрифт не виходить, то ви двічі клацніть на спеціальний шрифт, і уважно побачите назву шрифту верхньої сторони та скопіюйте цей шрифт, вставте, тут [UIFont fontWithName:@" here past your Custom font Name" size:20]
я сподіваюся, що ви отримаєте правильну відповідь