我有一個文本編輯器應用程式,它使用 Markdown 樣式的格式。當插入符號/選擇不在相應的行上時,格式字符被隱藏。
我成功地使用shouldGenerateGlyphs:方法 inNSLayoutManagerDelegate來操縱在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/net/312583.html
下一篇:類內的按鈕動作選擇器
