TextKit:无法在 Swift 中将粗体更改为 "UnBold"
TextKit: can´t change Bold Font to "UnBold" in Swift
我有一个带有一些文本的 TextView,字体是 Bold。我有一个按钮。点击此按钮后,粗体字体应更改为 "UnBold"
有一个名为 "FontManager" 的 ViewController 和一个 class 来管理 TextKit/UITextView 的字体。
我的 FontManager 代码:
import UIKit
class FontManager {
var textView: UITextView! = nil
init(textView: UITextView) {
self.textView = textView
self.setFont()
}
// set a Range of the TextView to Bold at start:
func setFont() {
// set font to "HelveticaNeue"
let newFont = UIFont(name:"HelveticaNeue", size: textView.font!.pointSize)
self.textView.font = newFont
let range = NSMakeRange(11, 24)
self.makeBold(range)
}
// set attributes
func getDict(key : String, value: UIFont ) -> [String: AnyObject] {
return [key : value]
}
此代码设置 selectedRange 中的字体为粗体没有问题
func makeBold(selectedRange: NSRange) {
self.addOrRemoveFontTraitWithName("Bold", andValue: UIFontDescriptorSymbolicTraits.TraitBold.rawValue, andRange:selectedRange)
}
func addOrRemoveFontTraitWithName(traitName: String, andValue traitValue: UInt32, andRange selectedRange: NSRange) {
let currentAttributesDict : NSDictionary! = self.textView.textStorage.attributesAtIndex(selectedRange.location, effectiveRange: nil)
let currentFont : UIFont = currentAttributesDict .objectForKey(NSFontAttributeName) as! UIFont
let fontDescriptor : UIFontDescriptor! = currentFont.fontDescriptor()
let fontNameAttribute : NSString = fontDescriptor.objectForKey(UIFontDescriptorNameAttribute) as! NSString
var existingTraitsWithNewTrait : UInt32! = nil
var changedFontDescriptor : UIFontDescriptor! = nil
如果已经有粗体文本,请检查一下。如果不是 (== NSNotFound),则 selectedRange 中的文本变为粗体 "trait"
if fontNameAttribute.rangeOfString(traitName).location == NSNotFound {
existingTraitsWithNewTrait = fontDescriptor.symbolicTraits.rawValue | traitValue
changedFontDescriptor = fontDescriptor.fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits.TraitBold)
(1) 如果 selectedRange 中的字体是 粗体(否则:!= NSNotFound)字体 应该 设置为正常(不加粗)
} else {
existingTraitsWithNewTrait = fontDescriptor.symbolicTraits.rawValue & ~traitValue
changedFontDescriptor = fontDescriptor.fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits(rawValue: existingTraitsWithNewTrait))
}
let updatedFont = UIFont(descriptor:changedFontDescriptor, size: 0.0)
let dict = self.getDict(NSFontAttributeName, value: updatedFont)
self.textView.textStorage.beginEditing()
textView.textStorage.setAttributes(dict, range: selectedRange)
self.textView.textStorage.endEditing()
}
现在 ViewController 的代码:
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
var fontManger: FontManager! = nil
// the @IBAction to change the Font
@IBAction func SwitchFont(sender: AnyObject) {
let range = NSMakeRange(11, 24)
fontManger.makeBold(range)
}
@IBOutlet weak var textView: UITextView!
var fontManger: FontManager! = nil
override func viewDidLoad() {
super.viewDidLoad()
// init the FontManager
fontManger = FontManager(textView: self.textView)
}
第一次点击按钮时应该跳到 (1),否则...
但这并没有发生。在调试模式下可以看到吗???
欢迎任何想法!
找到了!粗体字为 "HelveticaNeue-Bold"。 "UnBold"-字体是 "HelveticaNeue-Medium" 但不是 "HelveticaNeue" 并且这种差异几乎是不可见的!
没有其他方法可以添加
var updatedFont = UIFont(descriptor:changedFontDescriptor, size: 0.0)
if updatedFont.fontName == "HelveticaNeue-Medium" {
updatedFont = UIFont(name:"HelveticaNeue", size: textView.font!.pointSize)!
}
或者您有更好的解决方案吗?
我有一个带有一些文本的 TextView,字体是 Bold。我有一个按钮。点击此按钮后,粗体字体应更改为 "UnBold"
有一个名为 "FontManager" 的 ViewController 和一个 class 来管理 TextKit/UITextView 的字体。
我的 FontManager 代码:
import UIKit
class FontManager {
var textView: UITextView! = nil
init(textView: UITextView) {
self.textView = textView
self.setFont()
}
// set a Range of the TextView to Bold at start:
func setFont() {
// set font to "HelveticaNeue"
let newFont = UIFont(name:"HelveticaNeue", size: textView.font!.pointSize)
self.textView.font = newFont
let range = NSMakeRange(11, 24)
self.makeBold(range)
}
// set attributes
func getDict(key : String, value: UIFont ) -> [String: AnyObject] {
return [key : value]
}
此代码设置 selectedRange 中的字体为粗体没有问题
func makeBold(selectedRange: NSRange) {
self.addOrRemoveFontTraitWithName("Bold", andValue: UIFontDescriptorSymbolicTraits.TraitBold.rawValue, andRange:selectedRange)
}
func addOrRemoveFontTraitWithName(traitName: String, andValue traitValue: UInt32, andRange selectedRange: NSRange) {
let currentAttributesDict : NSDictionary! = self.textView.textStorage.attributesAtIndex(selectedRange.location, effectiveRange: nil)
let currentFont : UIFont = currentAttributesDict .objectForKey(NSFontAttributeName) as! UIFont
let fontDescriptor : UIFontDescriptor! = currentFont.fontDescriptor()
let fontNameAttribute : NSString = fontDescriptor.objectForKey(UIFontDescriptorNameAttribute) as! NSString
var existingTraitsWithNewTrait : UInt32! = nil
var changedFontDescriptor : UIFontDescriptor! = nil
如果已经有粗体文本,请检查一下。如果不是 (== NSNotFound),则 selectedRange 中的文本变为粗体 "trait"
if fontNameAttribute.rangeOfString(traitName).location == NSNotFound {
existingTraitsWithNewTrait = fontDescriptor.symbolicTraits.rawValue | traitValue
changedFontDescriptor = fontDescriptor.fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits.TraitBold)
(1) 如果 selectedRange 中的字体是 粗体(否则:!= NSNotFound)字体 应该 设置为正常(不加粗)
} else {
existingTraitsWithNewTrait = fontDescriptor.symbolicTraits.rawValue & ~traitValue
changedFontDescriptor = fontDescriptor.fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits(rawValue: existingTraitsWithNewTrait))
}
let updatedFont = UIFont(descriptor:changedFontDescriptor, size: 0.0)
let dict = self.getDict(NSFontAttributeName, value: updatedFont)
self.textView.textStorage.beginEditing()
textView.textStorage.setAttributes(dict, range: selectedRange)
self.textView.textStorage.endEditing()
}
现在 ViewController 的代码:
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
var fontManger: FontManager! = nil
// the @IBAction to change the Font
@IBAction func SwitchFont(sender: AnyObject) {
let range = NSMakeRange(11, 24)
fontManger.makeBold(range)
}
@IBOutlet weak var textView: UITextView!
var fontManger: FontManager! = nil
override func viewDidLoad() {
super.viewDidLoad()
// init the FontManager
fontManger = FontManager(textView: self.textView)
}
第一次点击按钮时应该跳到 (1),否则...
但这并没有发生。在调试模式下可以看到吗???
欢迎任何想法!
找到了!粗体字为 "HelveticaNeue-Bold"。 "UnBold"-字体是 "HelveticaNeue-Medium" 但不是 "HelveticaNeue" 并且这种差异几乎是不可见的!
没有其他方法可以添加
var updatedFont = UIFont(descriptor:changedFontDescriptor, size: 0.0)
if updatedFont.fontName == "HelveticaNeue-Medium" {
updatedFont = UIFont(name:"HelveticaNeue", size: textView.font!.pointSize)!
}
或者您有更好的解决方案吗?