UITextView с настраиваемым шрифтом не работает, когда текст установлен на "атрибут",

У меня есть UITextView с некоторым текстом, который поступает из .rtf(вставлен непосредственно на Xcode)

Контекст содержит только один пользовательский шрифт (Futura Book BT 11.0)

Если я устанавливаю свойство "text (attribated)" равным "plain" = Пользовательский шрифт отображается правильно из раскадровки и из приложения

Если я установил свойство "text" в "attributed" =. Пользовательский шрифт отображается правильно из раскадровки, но не из приложения.

Как моя цель состояла в том, чтобы иметь текст с несколькими работающими шрифтами, как заставить атрибутное свойство работать с пользовательскими шрифтами? (Swift)

Спасибо!

Ответы

Ответ 1

Пользовательский шрифт отображается правильно из раскадровки, но не из приложения.

Приложение не отображает шрифт вообще или восстанавливает системный шрифт? Если он вернется к Helvetica, похоже, что это может быть известная ошибка в iOS 8.1  http://openradar.appspot.com/radar?id=5117089870249984

Возможное решение: Вы тестировали его на тренажере и устройстве? Возможно, это просто не работает на симуляторе, а это значит, что вы можете исправить это, установив шрифт в вашей системе.

Ответ 2

Что я делаю:

private var _mutableString: NSMutableAttributedString!

if !isTitle {
    var titleFont: UIFont = UIFont(name: StyleGlobals.TitleFontName, size: StyleGlobals.TitleFontSize)!
    self._mutableString.addAttribute(NSFontAttributeName, value: titleFont, range: NSMakeRange(0, count(self._mutableString.string)))
    self._mutableString.addAttribute(NSForegroundColorAttributeName, value: StyleGlobals.FontColor, range: NSMakeRange(0, count(self._mutableString.string)))
}

self.Label.attributedText = self._mutableString

Это касается как нового цвета шрифта, так и самого шрифта. У меня есть определенный UILabel, который должен содержать различные шрифты. Это может быть название или субтитр. Поэтому мне пришлось применить шрифт, когда я определил, что будет содержать ярлык.

Ответ 3

Вы уверены, что "Futura Book BT" правильно добавлен как пользовательский шрифт в ваше приложение?

Ответ 4

В моем случае проблема заключалась в том, что у меня не было установленного шрифта в моей системе, поэтому я сделал это с помощью Font Book. Затем шрифт появился в списке в атрибутных текстовых меток.

EDIT: Теперь у меня возникли проблемы с отображением текущего текста и сделал это (я использую UILabel, не тестируемый в UITextView):

Мое решение - создать атрибутную строку из html (увидели это расширение где-то здесь в SO):

extension String {
    var html2AttStr: NSAttributedString? {
        guard let data = dataUsingEncoding(NSUTF8StringEncoding) else { return nil }
        do {
            return try NSAttributedString(data: data,
                                          options: [
                                            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                            NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
                                          documentAttributes: nil)
        } catch let error as NSError {
            //print(error.code)
            return nil
        }
    }
}

И тогда я делаю что-то вроде:

let htmlStyle = "<meta charset=\"UTF-8\"><style> body { font-family: 'SourceSansPro-Light'; font-size: 18px; text-align: center; } b {font-family: 'SourceSansPro-Light'; }</style>"
let myString = "<font size=\"+2\">Slightly bigger font</font><br><br>Some message with normal text <b>a bold text</b> and some more text"
var attributedString = htmlStyle
attributedString.appendContentsOf(myString)
informationLabel.attributedText = attributedString.html2AttStr

Одно из преимуществ этого заключается в том, что теперь я могу поместить некоторый текст "% s" внутри строки для разбора слова/числа/и т.д. и Это легче перевести и разобрать. С форматированным текстом мне пришлось собрать кучу кода для поиска текста, применяя формат, не касаясь чего-либо вокруг. Это очень хорошо для меня:)

Ответ 5

Пожалуйста, позвоните ко всему вашему коду в методе viewDidLoadSubviews! Чем работает. У меня много проблем при изменении размера шрифта, стиля я viewDidLoad или методов viewWillApperar.

Итак, просто переместите свой код в метод viewDidLoadSubviews. Вы можете использовать флаг для изменения шрифтов только один раз, так как этот метод можно вызвать много раз:]

Ответ 6

Существует обходное решение. Просто дважды щелкните файл шрифта (в Finder) и установите его в систему.

Ответ 7

Создание UITextview "выбирается" из раскадровки будет работать.

Ответ 8

У меня возникла та же проблема, когда я использовал несколько пользовательских шрифтов в атрибуте UILabel. Раскадровка показывает правильный результат, но устройство не работает!!

Что я узнал, если размер шрифта отличается от текста с разными пользовательскими шрифтами. Он отлично работает!!

Итак, теперь я использую размер шрифта с незначительной разницей. Например, если 14, я использовал 14.01 для другого. Его невозможно сделать внутри раскадровки, поэтому я открыл раскадровку в качестве исходного кода и вручную установил размер шрифта, например:

<attributedString key="attributedTitle">    
  <fragment content="Do not have account? ">
      <attributes>
        <color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
        <font key="NSFont" size="14" name="Roboto-Light"/>
        <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
      </attributes>
    </fragment>
    <fragment content="Login">
      <attributes>
        <color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
        <font key="NSFont" size="14.01" name="Roboto-Bold"/>
        <paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
      </attributes>
    </fragment>
<attributedString key="attributedTitle">

Но все же я не могу найти, почему это происходит!