我有一個文本編輯器應用程式,它使用 Markdown 樣式格式。當插入符號/選擇不在相應的行上時,格式字符被隱藏。
我成功地使用shouldGenerateGlyphs:方法NSLayoutManagerDelegate來操縱繪制的內容NSTextView。我正在使用純委托,并且沒有對布局管理器本身進行子類化。
但是,我不明白如何在字形再生后正確定位插入符號。選擇更改后,我正在呼叫一個方法(這里稱為hideAndShowMarkup),它為當前編輯的行和之前選擇的行重新生成字形。因為在螢屏上添加了一些字形,插入符號被渲染錯誤。
-(void)hideAndShowMarkup {
[self.layoutManager invalidateGlyphsForCharacterRange:currentLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateGlyphsForCharacterRange:prevLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager ensureGlyphsForCharacterRange:currentLine.range];
[self.layoutManager ensureGlyphsForCharacterRange:prevLine.range];
[self updateInsertionPointStateAndRestartTimer:YES];
}
updateInsertionPoint...在這里不起作用,因為確保字形似乎異步運行。我也嘗試在didCompleteLayoutForTextContainer:委托方法中呼叫它,但沒有效果。
有沒有辦法檢測字形何時實際繪制,并在此之后確保插入點位置?
uj5u.com熱心網友回復:
NSLayoutManager 令人驚訝的是,它的檔案記錄很差,并且要了解其內部作業原理,需要查看隨機公共存盤庫中的實作。
要更改范圍內的字形并正確設定插入符號的位置,您首先需要使兩個已更改范圍的字形無效,然后使插入符號即將定位的范圍的布局無效。
然后,在確保存在當前圖形背景關系后,可以同步重繪字形。在此之后,更新插入點正常作業。
在下面的示例中,我有兩個物件,line其中prevLine包含插入符號現在所在的行和一個插入符號離開的行的范圍。
-(void)hideAndShowMarkup {
[self.layoutManager invalidateGlyphsForCharacterRange:line.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateGlyphsForCharacterRange:prevLine.range changeInLength:0 actualCharacterRange:nil];
[self.layoutManager invalidateLayoutForCharacterRange:line.range actualCharacterRange:nil];
if (NSGraphicsContext.currentContext) {
[self.layoutManager drawGlyphsForGlyphRange:line.range atPoint:self.frame.origin];
[self.layoutManager drawGlyphsForGlyphRange:prevLine.range atPoint:self.frame.origin];
}
[self updateInsertionPointStateAndRestartTimer:NO];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/416692.html
標籤:
