我有包裹的NSTextView實體垂直堆疊,例如:
快速的棕色狐貍
跳過了懶惰的狗
積木喜歡我的大
石英的獅身人面像
我需要用上/下箭頭在它們之間移動。例如,當游標位于 "lazy "中的l之后,用戶按下向下箭頭時,游標應直接跳到 "my "中的y之后 - 就像這些句子在同一個文本視圖中一樣。
默認情況下,當游標位于最后一個被包裹的行時按下向下的箭頭,文本視圖將其移動到該行的末尾。雖然我可以使用textView(_:doCommandBy:)中的NSTextViewDelegate來檢測 "向下箭頭 "選擇器并覆寫默認行為,但有兩個問題:
我可以通過
selectedRanges屬性獲得游標的位置,然后檢查這個位置之后的換行符,來確定游標是否在最后一行,但是無法知道它是否在最后一個包裹的行,即在當前文本視圖的邊界附近。我需要知道游標的 X 坐標,以便將其放置在另一個文本視圖中大致相同的 X 坐標上(字體不一定是固定寬度的,所以我不能依賴字符數)。
我可以判斷出 "箭頭向下 "的選擇器是什么。
我想這兩個問題都可以通過NSLayoutManager來解決,但是我無法理解它所有的可用方法。
uj5u.com熱心網友回復:
結果是相對容易的,以下是我所做的(例子是在C#中)。首先,boundingRect(forGlyphRange:in:)獲得游標在當前視圖中的位置:
var cursorLocation = new NSRange(CurrentTextView.SelectedRange.Location, 0)。
var cursorCoordinates = CurrentTextView.LayoutManager.BoundingRectForGlyphRange(cursorLocation, CurrentTextView.TextContainer).Location。
那么如果第二個文本視圖在下面,插入點將在Y軸上的0處:
var insertionPoint = new CGPoint(cursorCoordinates.X, 0)。
如果是在上面,那么應該使用另一個視圖的高度(減少1,否則產生的字符索引將是不正確的,游標將被放在行尾):
var insertionPoint = new CGPoint(cursorCoordinates.X, AnotherTextView.Bounds.Size.Height - 1)。
在得到插入點之后,另一個視圖需要成為第一回應者,然后characterIndexForInsertion(at:)完成作業:
Window.MakeFirstResponder(AnotherTextView)。
var index = AnotherTextView.CharacterIndex(insertionPoint);
AnotherTextView.SelectedRange = new NSRange(index, 0)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320042.html
標籤:
上一篇:針對不同日志級別的例外標準
下一篇:在一個繼承類的資料結構中更新自己
