NSTextView中适合的字符数

时间:2018-07-08 04:57:02

标签: swift macos cocoa nstextview

注意:此问题是针对MacOS应用而非iOS


我有一项业务要求,即将这个惊人的iOS自定义文本视图(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上的任何滚动。我的意图是在其末尾具有一个“ ... More” 按钮的视图,然后单击它即可扩展视图。因此,如果我们可以在其中找到可见的字符,也欢迎使用基于NSTextField的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用data = ["xbox 360 | 13000 | new","playstation 4 | 30000 | new","playstation 3 | 30000 | old","playstation 2 | 30000 | old"] 方法获得product = ["xbox 360","playstation 4","playstation 3","playstation 2"] cost = ["13000","30000","30000","30000"] condition = ["new","new","old","old"] 的可见部分。从那里,您只需要获取该矩形范围内的文本范围即可。因此,如果您的视图仅支持垂直滚动,则应执行以下操作:

NSTextView

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