gpt4 book ai didi

swift - 适合 NSTextView 的字符数

转载 作者:行者123 更新时间:2023-11-28 05:56:53 26 4
gpt4 key购买 nike

注意:此问题适用于 MacOS 应用而非 iOS


我的业务需求是将这个惊人的 iOS 自定义 TextView (ReadMoreTextView) 转换为 macOS(AppKit)。但是我发现很难转换它。我希望这会很容易,因为 UITextViewNSTextView 使用 NSTextContainerNSLayoutManagerNSTextStorage。但似乎它们在两个平台上的行为不同。

我需要计算在 NSTextView 上可见的字符数或字符范围。我正在尝试使用以下方法,但它总是返回完整的字符范围而不是可见字符范围(实际文本长度而不是可见文本长度)。我在布局管理器中找不到任何其他方法可以帮助解决这个问题。如果您对此有任何指示,请告诉我。

代码如下:

extension NSLayoutManager {
func characterRangeThatFits(textContainer container: NSTextContainer) -> NSRange {
//this is the current maximum number of lines
//container.maximumNumberOfLines = 3

var rangeThatFits = self.glyphRange(for: container)
rangeThatFits = self.characterRange(forGlyphRange: rangeThatFits, actualGlyphRange: nil)
return rangeThatFits
}
}

欢迎使用 Swift 和 Objective C 回答问题。

更新:

请忽略 TextView 上的任何滚动,因为我禁用了所有类型的滚动。我的意图是在它的末尾有一个带有 “... 更多” 按钮的 View ,然后点击它, View 就会展开。出于这个原因,如果我们能在其中找到可见字符,也欢迎基于 NSTextField 的解决方案。

最佳答案

您可以使用 visibleRect 方法获取 NSTextView 的可见部分。从那里,您只需要获取属于该矩形的文本范围。因此,如果您的 View 仅支持垂直滚动,那么这样的事情应该可行:

let visRect = textView.visibleRect

let layoutManager = textView.layoutManager!
let container = textView.textContainer!

let glyphRange = layoutManager.glyphRange(forBoundingRect: visRect, in: container)
let charRange = layoutManager.characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil)

请注意,如果您的 NSTextView 支持水平滚动而不仅仅是垂直滚动,您将不得不做比这更多的工作,因为您可能会看到一个不连续的 block 文本。在这种情况下,您必须为每个可见的线段获取一堆较小的范围,而不是像这样只获取整个范围。

关于swift - 适合 NSTextView 的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51228964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com