2016-03-19 4 views
3

Я пытаюсь создать Swift пользовательский текстовый редактор (облегченная версия) и застрял на ошибке iOS 8 fontDescriptorWithSymbolicTraits, возвращая нуль. Есть ли какие-либо быстрые методы обхода?Быстрая альтернатива для шрифтаDescriptorWithSymbolicTraits ios 8 ошибка

Я создал small project sample here, вы можете загрузить и запустить следующий сценарий:

  1. Выберите текст
  2. Нажмите на кнопку "B" кнопку
  3. Нажмите на "I" кнопка

Аварии приложений, fontDescriptorWithSymbolicTraits возвращается nil :(

private func addOrRemoveTraitWithName(traitName: String, traitValue: UInt32) { 
    let range = self.textEditor.selectedRange 
    let currentAttributesDict = self.textEditor.textStorage.attributesAtIndex(range.location, effectiveRange: nil) 
    let currentFont = currentAttributesDict[NSFontAttributeName] 

    let fontDescriptor = currentFont?.fontDescriptor() 
    let fontNameAttribute = fontDescriptor?.fontAttributes()[UIFontDescriptorNameAttribute] 

    var changedFontDescriptor: UIFontDescriptor? 

    if fontNameAttribute?.rangeOfString(traitName).location == NSNotFound { 
     let existingTraitsWithNewTrait = UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor!.symbolicTraits.rawValue | traitValue) 
     changedFontDescriptor = fontDescriptor?.fontDescriptorWithSymbolicTraits(existingTraitsWithNewTrait) 
    } else { 

     let existingTraitsWithoutTrait = UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor!.symbolicTraits.rawValue & ~traitValue) 
     changedFontDescriptor = fontDescriptor?.fontDescriptorWithSymbolicTraits(existingTraitsWithoutTrait) 

    } 

    let updatedFont = UIFont(descriptor: changedFontDescriptor!, size: 0.0) 

    var dict = [String : AnyObject]() 
    dict[NSFontAttributeName] = updatedFont 
    self.textEditor.textStorage.beginEditing() 
    self.textEditor.textStorage.setAttributes(dict, range: range) 
    self.textEditor.textStorage.endEditing() 
} 

Я настоятельно рекомендую взять быстрый взгляд на sample project

Какие варианты у меня есть?

Я также видел, что on Apple documentation the method который был использован другой отсутствует в SDK & ДОКУМЕНТАЦИЯ

То, что другие говорят об этом:

  1. Font Descriptor returns nil in iOS 8
  2. http://www.openradar.me/19922049

ответ

3

Вы» вернемся к этому. К счастью, ошибка была исправлена ​​в iOS 8.3. Единственное надежное решение - опуститься до уровня Core Text и выполнить там приложение признаков. Это боль, но она решает проблему.

Так, например, перед тем прошивкой 8.3, это не работает:

if let body = UIFont(name: "GillSans", size: 15), 
    emphasis = body.fontDescriptor().fontDescriptorWithSymbolicTraits(.TraitItalic) { 
     fbody = body 
     femphasis = UIFont(descriptor: emphasis, size: 0) 
} 

Таким образом, вы должны import CoreText и опуститься до этого уровня:

if let body = UIFont(name: "GillSans", size: 15), 
    result = CTFontCreateCopyWithSymbolicTraits(body as CTFont, 0, nil, .ItalicTrait, .ItalicTrait) { 
     fbody = body 
     femphasis = result as UIFont 
} 

К счастью, Swift 1.2 и позже известно, что UIFont и CTFont теперь бесплатны. До Swift 1.2 это было даже еще сложный! И, конечно же, в более ранних системах, они были не беспошлинной мостовой, и это было еще сложно.

+0

Извините, но я не уверен, где я должен поместить ваш код –

+0

Нигде. Я не пишу ваш код для вас. Я просто показываю вам эквивалентный код Core Text для выполнения символических признаков без использования сломанного дескриптора шрифта. – matt

+0

О, спасибо! Не беспокойтесь, я не хотел звучать так :) –