0

フォントがBoldのテキストを含む TextView があります。そして、私はボタンを持っています。このボタンをタップすると、ボールド フォントが「UnBold」に変わります。

ここに画像の説明を入力

ViewController と、TextKit/UITextView のフォントを管理する「FontManager」というクラスがあります。

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 で Font を Bold に設定するこのコードは問題なく動作します

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 のテキストは太字の「特性」になります

    if fontNameAttribute.rangeOfString(traitName).location == NSNotFound {
        existingTraitsWithNewTrait = fontDescriptor.symbolicTraits.rawValue | traitValue
        changedFontDescriptor = fontDescriptor.fontDescriptorWithSymbolicTraits(UIFontDescriptorSymbolicTraits.TraitBold)

(1) selectedRange のフォント太字の場合 (そうでない場合: != NSNotFound)、フォントは通常 (UnBold) に設定する必要があります。

   } 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) にスキップし、それ以外の場合は...

しかし、これは起こりません。デバッグモードでそれを見ることができますか???

どんなアイデアでも大歓迎です!

プロジェクトをダウンロード

4

1 に答える 1

0

それを見つけた!ボールドフォントは「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)!
}

それとも、より良い解決策が見えますか?

于 2016-03-16T15:52:18.550 に答える