2016-10-06 22 views
1

NSLayoutManagerに異なる属性のある範囲でグリフを描画させようとしていますが、引き続きNSTextStorageオブジェクトで設定された属性を使用します。NSLayoutManagerが異なるフォントでグリフを描画するようにします。

NSGlyphを別のフォントから作成し、NSTypesetterのグリフストレージのものに置き換えようとしていました。しかし、それはユーザーです - レイアウトマネージャーは、フォントとグリフをテキストストレージ属性文字列で指定された色で描画します。

public override func drawGlyphs(forGlyphRange glyphsToShow: NSRange, at origin: NSPoint) { 
    // now set glyphs for invisible characters 
    if PreferencesManager.shared.shouldShowInvisibles == true { 
     var spaceRanges = [NSRange]() 
     let charRange = self.characterRange(forGlyphRange: glyphsToShow, actualGlyphRange: nil) 
     var substring = (self.currentTextStorage.string as NSString).substring(with: charRange) 

     let spacesExpression = try? NSRegularExpression(pattern: "[ ]", options: NSRegularExpression.Options.useUnicodeWordBoundaries) 
     let substringRange = NSRange(location: 0, length: substring.characters.count) 
     if let matches = spacesExpression?.matches(in: substring, options: .withoutAnchoringBounds, range: substringRange) { 
      for match in matches { 
       spaceRanges.append(NSRange(location: charRange.location + match.range.location, length: 1)) 
      } 
     } 

     for spaceRange in spaceRanges { 
      let invisibleFont = Font(name: "Gill Sans", size: 11) ?? Font.systemFont(ofSize: 11) 

      // get any glyph to test the approach 
      var glyph = invisibleFont.glyph(withName: "paragraph") 

      // replce the glyphs 
      self.typesetter.substituteGlyphs(in: spaceRange, withGlyphs: &glyph) 

     } 
    } 
    // BUT LAYOUT MANAGER IGNORES THE FONT OF THE GLYPH I CREATED 
    super.drawGlyphs(forGlyphRange: glyphsToShow, at: origin) 
} 

これらの属性をある範囲で無視し、必要なフォントと色でグリフを描くようにするにはどうすればよいですか?私は不可視の文字を描く最も効率的な方法に取り組んでいるので、これが必要です。

答えて

1

ここでタイプセッターを直接変更していますが、superに電話すると、それはすべて機能します。代わりにgetGlyphs(in:glyphs:properties:characterIndexes:bidiLevels:)をオーバーライドし、superを呼び出して、必要なグリフを入れ替えます。またはsuperに電話する前にsetGlyphs(...)に電話することもできます。

廃止予定のメソッドを使用して何をしようとしているかの例は、Display hidden characters in NSTextViewを参照してください。 replaceGlyphAtIndexsetGlyphsに置き換えられていることはかなり確信しています。

+0

私はこのアプローチに精通しており、うまくいきます。しかし、私が言ったように、私はレイアウトマネージャーが不可視文字がある範囲で属性を無視する必要があります。私がちょうどタイプのグリッターをタイプセッターのレイアウトマネージャーに設定しているのであれば、まだテキストストレージに設定されている属性で描画します。しかし、私はフォントと色で目に見えない文字を描く必要があります。テキストストレージの変更は、描画されたテキストのジオメトリが変更されるため、オプションではありません。 –

関連する問題