Пользовательские шрифты отображаются в IB, но не в симуляторе
Я установил UITextView
и UILabel
для использования настраиваемого шрифта. (Это вертикально отраженный монгольский шрифт, но я также включил текст на английском языке, чтобы вы могли видеть эффект.) Слова отображаются в интерфейсе Builder, но в симуляторе большинство символов в UITextView
являются пустыми. Как ни странно, символы в UILabel
должны корректно отображаться в симуляторе.
Как мне их отобразить в UITextView
?
![enter image description here]()
Примечания:
- Я использую Xcode версии 6.3.2. Из this SO Q & A Я знаю, что пользовательские шрифты должны работать с Xcode 6 в IB.
- Я добавил файл шрифта в проект и выбрал его из пользовательского списка шрифтов как для
UITextView
, так и для UILabel
.
- В моем проекте
Info.plist
я добавил ключ "Шрифты, предоставленные приложением", и добавил к нему свой собственный шрифт.
![enter image description here]()
-
Этот вопрос является очень похожим (но отличается тем, что он не упоминает проблему UITextView
и UILabel
). На момент написания этой статьи ОП для этого вопроса не указывал, помогал или нет. Я выполнил код чтобы ответить, чтобы подтвердить, что мой шрифт действительно находится в комплекте. Я получил следующий результат, который подтверждает, что он находится в комплекте, так что все еще не решает мою проблему.
Family : ChimeeWhiteMirrored
Font : ChimeeWhiteMirrored
Кто-нибудь видит мою ошибку или имеет какие-то другие идеи?
Update
Получив @darkheartfelt downvote и comment к моему ответу ниже, я воссоздал свою оригинальную проблему, думая, может быть, я что-то пропустил. Хотя в iOS 9 шрифт выглядит несколько иначе в симуляторе, основная проблема все еще существует: он выглядит нормально в IB, но не в симуляторе.
![введите описание изображения здесь]()
Проблема может быть воспроизведена следующим образом (с использованием Xcode 7.1.1):
- Запустите новый проект с одним представлением.
- Добавить шрифт в проект (можно загрузить здесь из связанного проекта github)
- В файле Info.plist добавьте "Шрифты, предоставленные приложением" с именем шрифта "ChimeeWhiteMirrored.ttf".
- Подтвердите, что целевой ресурс "Copy Bundle Resources" содержит ChimeeWhiteMirrored.ttf.
- Добавьте
UITextView
в раскадровку.
- В инспекторе IB Attributes вставьте следующий текст:
1-10: one two three four five six seven eight nine ten
- В инспекторе атрибутов IB задайте шрифт Custom и семейству ChimeeWhiteMirrored.
Это воспроизводит проблему для специальных символов и, как я описал в своем ответе ниже, единственное, что я нашел, чтобы решить эту проблему, чтобы установить шрифт в код.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// set custom font
textView.font = UIFont(name: "ChimeeWhiteMirrored", size: (textView.font?.pointSize)!)
}
}
Если я ошибаюсь или что-то не хватает, пожалуйста, дайте мне знать. До тех пор мне придется продолжить использовать мой принятый ответ ниже.
Ответы
Ответ 1
Похоже, что, когда я впервые импортировал шрифт в свой проект, я выбрал "Добавить в целевое членство", после проверки шрифта он был не добавлен в цель! Он отлично справился с интерфейсом Builder, но не работал в симе или компилировался.
Выбор файла шрифта в представлении папки проекта и проверка целевого поля подписки исправлена:
![BfEaK.png]()
Ответ 2
Создать 2 категории классов
-------UILabel+ChimeeWhiteMirrored.h--------------
#import <UIKit/UIKit.h>
@interface UILabel (ChimeeWhiteMirrored)
@property (nonatomic, copy) NSString* fontNamelight;
@property (nonatomic, copy) NSString* fontNamebold;
@property (nonatomic, copy) NSString* fontNameboldIltalic;
@property (nonatomic, copy) NSString* fontNameRegular;
@end
--------------------------------------------
-------UILabel+ChimeeWhiteMirrored.m--------------
#import "UILabel+ChimeeWhiteMirrored.h"
@implementation UILabel (ChimeeWhiteMirrored)
- (NSString *)fontNamelight {
return self.font.fontName;
}
- (NSString *)fontNamebold {
return self.font.fontName;
}
- (NSString *)fontNameRegular {
return self.font.fontName;
}
- (NSString *)fontNameboldIltalic {
return self.font.fontName;
}
- (void)setFontNameRegular:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamelight:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNamebold:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
- (void)setFontNameboldIltalic:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
--------------------------------------------
И добавьте файл ttf в папку кода проекта, чем непосредственно добавьте имя файла ttf для метки из свойств.
![enter image description here]()
Ответ 3
Общие ошибки с добавлением пользовательских шрифтов в ваше приложение iOS - полезный контрольный список для правильного отображения пользовательских шрифтов. Однако ни одна из этих вещей не работала в этой конкретной ситуации.
В дополнение к тому, что вы делали в своих заметках, вам также необходимо установить шрифт в коде. Для этого есть несколько вариантов.
Вариант 1: Жесткий код напрямую
Это так же просто, как сделать следующее:
myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize)
Обратите внимание, что имя - это имя шрифта, а не имя файла шрифта (ChimeeWhiteMirrored.ttf).
Вариант 2: Пользовательские атрибуты времени выполнения
Если вы хотите избежать этого в коде, вы можете сделать это с помощью User Defined Runtime Attributes. Спасибо @SandeepAgrawal за эту идею. Пожалуйста, поддержите его ответ. Версия Swift, которая работала для меня, была
import UIKit
extension UITextView {
public var myFontName: String {
get {
return self.font.fontName
}
set {
self.font = UIFont(name: newValue, size: self.font.pointSize)
}
}
}
Затем добавьте путь, тип и значение ключа в инспекторе идентификации вида, как показано на следующем рисунке.
![enter image description here]()
Вариант 3: IBInspectable
Из того, что я прочитал, использование атрибутов User Defined Runtime - старомодный способ сделать это. Использование IBInspectable (и IBDesignable) позволяет вам вносить изменения в Interface Builder и сразу видеть изменения.