swift fontDescriptorWithSymbolicTraits 的替代方案 ios 8 个错误
swift alternative for fontDescriptorWithSymbolicTraits ios 8 bug
我正在尝试创建一个 Swift 自定义文本编辑器(精简版)并卡在 iOS 8 fontDescriptorWithSymbolicTraits 错误上,返回 nil。是否有任何 Swift 解决方法?
我创建了一个small project sample here,你可以下载并运行以下场景:
- Select一条文字
- 点击“B”按钮
- 点击“I”按钮
应用程序崩溃,fontDescriptorWithSymbolicTraits
returns 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
我有什么选择?
我还看到 SDK 和文档中缺少其他人使用的 on Apple documentation the method
其他人对此有何评论:
- Font Descriptor returns nil in iOS 8
- http://www.openradar.me/19922049
你说得对。幸运的是,该错误已在 iOS 8.3 中修复。唯一可靠的解决方法是降低到 Core Text 级别并在那里执行特征应用程序。很痛苦,但它解决了问题。
因此,例如,在 iOS 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 之前,这甚至 更 复杂!当然,在早期的系统中,它们 不是 免费桥接,这 更 困难。
我正在尝试创建一个 Swift 自定义文本编辑器(精简版)并卡在 iOS 8 fontDescriptorWithSymbolicTraits 错误上,返回 nil。是否有任何 Swift 解决方法?
我创建了一个small project sample here,你可以下载并运行以下场景:
- Select一条文字
- 点击“B”按钮
- 点击“I”按钮
应用程序崩溃,fontDescriptorWithSymbolicTraits
returns 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
我有什么选择?
我还看到 SDK 和文档中缺少其他人使用的 on Apple documentation the method
其他人对此有何评论:
- Font Descriptor returns nil in iOS 8
- http://www.openradar.me/19922049
你说得对。幸运的是,该错误已在 iOS 8.3 中修复。唯一可靠的解决方法是降低到 Core Text 级别并在那里执行特征应用程序。很痛苦,但它解决了问题。
因此,例如,在 iOS 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 之前,这甚至 更 复杂!当然,在早期的系统中,它们 不是 免费桥接,这 更 困难。