J'écris un éditeur de texte pour Mac OS X. J'ai besoin d'afficher les caractères cachés dans un NSTextView (comme les espaces, les tabulations et les caractères spéciaux). J'ai passé beaucoup de temps à chercher comment faire cela, mais je n'ai pas encore trouvé de réponse. Si quelqu'un pouvait m'indiquer la bonne direction, je lui en serais reconnaissant.
Réponses
Trop de publicités?Voici la solution de Pol en Swift :
class MyLayoutManager: NSLayoutManager {
override func drawGlyphsForGlyphRange(glyphsToShow: NSRange, atPoint origin: NSPoint) {
if let storage = self.textStorage {
let s = storage.string
let startIndex = s.startIndex
for var glyphIndex = glyphsToShow.location; glyphIndex < glyphsToShow.location + glyphsToShow.length; glyphIndex++ {
let characterIndex = self.characterIndexForGlyphAtIndex(glyphIndex)
let ch = s[startIndex.advancedBy(characterIndex)]
switch ch {
case " ":
let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
if let font = attrs[NSFontAttributeName] {
let g = font.glyphWithName("periodcentered")
self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
}
case "\n":
let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
if let font = attrs[NSFontAttributeName] {
// let g = font.glyphWithName("carriagereturn")
let g = font.glyphWithName("paragraph")
self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
}
case "\t":
let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil)
if let font = attrs[NSFontAttributeName] {
let g = font.glyphWithName("arrowdblright")
self.replaceGlyphAtIndex(glyphIndex, withGlyph: g)
}
default:
break
}
}
}
super.drawGlyphsForGlyphRange(glyphsToShow, atPoint: origin)
}
}
Et de lister les noms des glyphes :
func listFonts() {
let font = CGFontCreateWithFontName("Menlo-Regular")
for var i:UInt16 = 0; i < UInt16(CGFontGetNumberOfGlyphs(font)); i++ {
if let name = CGFontCopyGlyphNameForGlyph(font, i) {
print("name: \(name) at index \(i)")
}
}
}
Ce que j'ai fait, c'est surcharger la méthode ci-dessous dans une sous-classe de NSLayoutManager.
- (void)drawGlyphsForGlyphRange:(NSRange)range atPoint:(NSPoint)origin
{
[super drawGlyphsForGlyphRange:range atPoint:origin];
for (int i = range.location; i != range.location + range.length; i++)
{
// test each character in this range
// if appropriate replace it with -replaceGlyphAtIndex:withGlyph:
}
}
Je passe en boucle sur l'index de chaque personnage. Le problème que je rencontre maintenant est de savoir comment déterminer quel caractère se trouve à chaque endroit. Dois-je utiliser une méthode NSLayoutManager ou demander au NSTextView lui-même ? Les indices dans le premier cas sont-ils les mêmes que dans le second ?
Je peux obtenir un glyphe individuel avec -glyphAtIndex : mais je n'arrive pas à déterminer à quel caractère il correspond.
- Réponses précédentes
- Plus de réponses