2016-10-06 3 views
1

Я пытаюсь заставить NSLayoutManager нарисовать глиф в каком-то диапазоне с разными атрибутами, но он по-прежнему использует атрибуты, установленные в объекте NSTextStorage.Заставить NSLayoutManager рисовать глиф с другим шрифтом

Я пытался создать NSGlyph из другого шрифта и заменить его на хранилище глифов NSTypesetter. Но это useles - менеджер компоновки по-прежнему рисует этот глиф с шрифтом и цветом, указанным в строке атрибута хранения текста.

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, а затем поменяв любые глифы, которые вы хотите. В качестве альтернативы вы можете позвонить setGlyphs(...) здесь, прежде чем звонить super.

См. Display hidden characters in NSTextView для примера того, что вы пытаетесь использовать, используя устаревшие методы. Я вполне уверен, что replaceGlyphAtIndex заменен на setGlyphs.

+0

Я знаком с этим подходом, и он работает, я знаю. Но, как я уже сказал, мне нужен менеджер компоновки, чтобы игнорировать атрибуты на диапазонах, где лежат невидимые символы. Если я просто установил некоторый глиф в менеджере макета сеттера, он все равно будет рисовать его с атрибутами, установленными в текстовом хранилище. Но мне нужно нарисовать невидимые символы со шрифтом и цветом, которые я хочу. Изменение хранения текста не является вариантом, поскольку оно изменит геометрию нарисованного текста. –