Ich versuche unsichtbare Zeichen wie das neue Zeilenzeichen in meiner NSTextView Unterklasse zu zeigen. Der übliche Ansatz wie das Überschreiben der drawGlyph-Methode von NSLayoutManager ist eine schlechte Idee, weil sie zu langsam ist und bei mehrseitigen Layouts nicht richtig funktioniert.NSLayoutManager verbirgt neue Zeilenzeichen, egal was ich mache
Was ich versuche ist, die SetGlyph-Methode des NSLayoutManager zu überschreiben, so dass es unsichtbare "\ n" Glyphe durch "¶" Glyphe und "" durch "∙" ersetzen würde.
Und es funktioniert auf die "" Space Glyphs, hat aber keine Auswirkungen auf die neue Zeile Zeichen.
public override func setGlyphs(_ glyphs: UnsafePointer<CGGlyph>, properties props: UnsafePointer<NSGlyphProperty>, characterIndexes charIndexes: UnsafePointer<Int>, font aFont: Font, forGlyphRange glyphRange: NSRange) {
var substring = (self.currentTextStorage.string as NSString).substring(with: glyphRange)
// replace invisible characters with visible
if PreferencesManager.shared.shouldShowInvisibles == true {
substring = substring.replacingOccurrences(of: " ", with: "\u{00B7}")
substring = substring.replacingOccurrences(of: "\n", with: "u{00B6}")
}
// create a CFString
let stringRef = substring as CFString
let count = CFStringGetLength(stringRef)
// convert processed string to the C-pointer
let cfRange = CFRangeMake(0, count)
let fontRef = CTFontCreateWithName(aFont.fontName as CFString?, aFont.pointSize, nil)
let characters = UnsafeMutablePointer<UniChar>.allocate(capacity: MemoryLayout<UniChar>.size * count)
CFStringGetCharacters(stringRef, cfRange, characters)
// get glyphs for the pointer of characters
let glyphsRef = UnsafeMutablePointer<CGGlyph>.allocate(capacity: MemoryLayout<CGGlyph>.size * count)
CTFontGetGlyphsForCharacters(fontRef, characters, glyphsRef, count)
// set those glyphs
super.setGlyphs(glyphsRef, properties:props, characterIndexes: charIndexes, font: aFont, forGlyphRange: glyphRange)
}
Dann kam ich mit einer Idee: es sieht aus wie NSTypesetter neue Linie char Bereiche wie die markiert es überhaupt nicht verarbeiten soll. Also habe ich NSTypesetter subklassifiziert und eine Methode überschrieben:
Aber es funktioniert nicht. NSLayoutManager generiert immer noch keine Glyphe für das neue Zeilenzeichen, egal welche Glyphe ich erstelle.
Was mache ich falsch?
Scheint Dieser Code ist in Swift3, wie können wir es in Swift 2.3 konvertieren? Ich habe festgestellt, dass "MemoryLayout" in Swift 2.3 nicht verfügbar ist. –