Display hidden characters in NSTextView

前端 未结 6 1548
孤城傲影
孤城傲影 2020-12-15 01:14

I am writing a text editor for Mac OS X. I need to display hidden characters in an NSTextView (such as spaces, tabs, and special characters). I have spent a lot of time se

6条回答
  •  抹茶落季
    2020-12-15 02:02

    Here's a fully working and clean implementation

    @interface GILayoutManager : NSLayoutManager
    @end
    
    @implementation GILayoutManager
    
    - (void)drawGlyphsForGlyphRange:(NSRange)range atPoint:(NSPoint)point {
      NSTextStorage* storage = self.textStorage;
      NSString* string = storage.string;
      for (NSUInteger glyphIndex = range.location; glyphIndex < range.location + range.length; glyphIndex++) {
        NSUInteger characterIndex = [self characterIndexForGlyphAtIndex: glyphIndex];
        switch ([string characterAtIndex:characterIndex]) {
    
          case ' ': {
            NSFont* font = [storage attribute:NSFontAttributeName atIndex:characterIndex effectiveRange:NULL];
            [self replaceGlyphAtIndex:glyphIndex withGlyph:[font glyphWithName:@"periodcentered"]];
            break;
          }
    
          case '\n': {
            NSFont* font = [storage attribute:NSFontAttributeName atIndex:characterIndex effectiveRange:NULL];
            [self replaceGlyphAtIndex:glyphIndex withGlyph:[font glyphWithName:@"carriagereturn"]];
            break;
          }
    
        }
      }
    
      [super drawGlyphsForGlyphRange:range atPoint:point];
    }
    
    @end
    

    To install, use:

    [myTextView.textContainer replaceLayoutManager:[[GILayoutManager alloc] init]];
    

    To find font glyph names, you have to go to CoreGraphics:

    CGFontRef font = CGFontCreateWithFontName(CFSTR("Menlo-Regular"));
    for (size_t i = 0; i < CGFontGetNumberOfGlyphs(font); ++i) {
      printf("%s\n", [CFBridgingRelease(CGFontCopyGlyphNameForGlyph(font, i)) UTF8String]);
    }
    

提交回复
热议问题