Пользовательские шрифты отображаются в IB, но не в симуляторе

Я установил UITextView и UILabel для использования настраиваемого шрифта. (Это вертикально отраженный монгольский шрифт, но я также включил текст на английском языке, чтобы вы могли видеть эффект.) Слова отображаются в интерфейсе Builder, но в симуляторе большинство символов в UITextView являются пустыми. Как ни странно, символы в UILabel должны корректно отображаться в симуляторе.

Как мне их отобразить в UITextView?

enter image description here

Примечания:

Кто-нибудь видит мою ошибку или имеет какие-то другие идеи?

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 и сразу видеть изменения.