2016-10-06 3 views
1

NSLayoutManager가 다른 속성으로 일부 범위에서 글리프를 그리지 만 NSTextStorage 개체에서 설정된 속성을 사용합니다.강제로 NSLayoutManager가 다른 글꼴로 글리프를 그립니다.

다른 글꼴에서 NSGlyph를 만들고 NSTypesetter의 글리프 저장 공간에있는 NSGlyph로 바꾸려고했습니다. 그러나 그것은 사용자 인터페이스입니다. 레이아웃 관리자는 여전히 텍스트 저장 속성 문자열에 지정된 색상의 글꼴로 그립을 그립니다.

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

나는 그 접근 방식에 익숙하고 잘 작동한다. 하지만 내가 말했듯이, 레이아웃 관리자는 보이지 않는 문자가있는 범위에서 속성을 무시해야합니다. 필자가 setter 레이아웃 관리자에서 일부 글리프 (glyph)를 설정했다면 여전히 텍스트 저장소에 설정된 속성을 사용하여 그리게됩니다. 하지만 원하는 글꼴과 색상으로 보이지 않는 문자를 그려야합니다. 텍스트 저장 공간을 수정하면 그리기 텍스트의 기하 도형이 변경되므로 옵션을 사용할 수 없습니다. –