2017-06-30 2 views
0

Mein Ziel ist es, Textauswahlverhalten ähnlich zu Apple Pages, MS Word und jedem anderen Textprozessor, wenn NSTextView wählt nur Text-Glyphen und keine Einrückungen oder die gesamte NSTextContainer Größe wie standardmäßig Das Verhalten von NSTextView.Seltsame Änderungen an NSLayoutManager in 10.11 und höher

Mit diesem Ziel vor Augen, subclassed ich NSLayoutManager und overrided func rectArray(forCharacterRange charRange: NSRange, withinSelectedCharacterRange selCharRange: NSRange, in container: NSTextContainer, rectCount: UnsafeMutablePointer<Int>) -> NSRectArray?

In meiner Überschreibung ich einfach neue Rects berechnet, die nur Glyphen und lehnt jegliche Einzüge, Leerzeichen usw.

Alles funktionierte gut gebunden. Aber plötzlich hat Apple in Mac OS 10.11 die Methode, die ich verwende, abgelehnt. Und schlug vor, stattdessen func enumerateEnclosingRectsForGlyphRange: withinSelectedGlyphRange: inTextContainer: usingBlock: zu verwenden.

Aber es scheint, dass diese neue Methode nicht in einer Weise funktioniert, die die vorherige veraltete Methode tat. Es ist nicht mehr möglich, umschließende Verweise anzupassen. Alles, was ich tun kann, ist, durch Rectures zu zählen, die TextKit berechnet hat. Und jetzt ist es unmöglich, ein wünschenswertes Textauswahlverhalten zu erreichen, da die Rectures schreibgeschützt sind. Und übrigens wird die neue Methode vom TextKit überhaupt nicht aufgerufen. Also ist es sinnlos, darüber nachzudenken.

Was soll ich tun?

+0

Einen Fehlerbericht einreichen? – bhaller

+0

Es ist kein Fehler. Es war beabsichtigt. Von Entwurf. Sie ersetzten eine alte Methode durch die neue. Es ist nur die Funktionalität des neuen ist nicht annähernd ähnlich. –

+0

Warum können Sie 'enumerateEnclosingRects (forGlyphRange: inSelectedGlyphRange: in: using:)' anstelle von 'rectArray (forGlyphRange: innerhalbSelectedGlyphRange: in: rectCount:)' überschreiben? Oder ist das in Swift unmöglich? – Willeke

Antwort

0

Während die Überraschung mit nicht-äquivalenten Methode Ersatz bleibt, konnte ich eine Lösung finden.

Es stellte sich heraus, dass ich rectArrayForCharacterRange Methode nicht brauche, um den Job zu erledigen. Ich habe gerade func fillBackgroundRectArray(_ rectArray: UnsafePointer<NSRect>, count rectCount: Int, forCharacterRange charRange: NSRange, color: NSColor) übersteuert und meine Berechnungen dort hineingelegt.

Alles funktioniert jetzt wie ein Zauber!

Verwandte Themen