如何确定 TextKit 在哪里出现软换行符?

How to decide where soft line-breaks occur with TextKit?

我正在尝试定义文本中出现软换行的位置,NSLayoutManagerDelegate 方法 layoutManager(_:shouldBreakLineByWordBeforeCharacterAt:) 似乎是开始的地方。我的问题是它没有被调用,尽管我的其他方法是。这是在基本 UITextView 设置中发生的。在什么情况下调用此方法 - 我找对地方了吗?

这是我的 TextKit 堆栈的样子:

class DemoTextView: UITextView, NSLayoutManagerDelegate {

    //  MARK: - Init

    required init() {
        let textStorage = NSTextStorage(string: "i will overflow several lines probably just saying")

        let layoutManager = NSLayoutManager()

        textStorage.addLayoutManager(layoutManager)

        let textContainer = NSTextContainer(size: CGSize(width: 100, height: 100))

        textContainer.lineBreakMode = .byWordWrapping
        textContainer.lineFragmentPadding = 0

        layoutManager.addTextContainer(textContainer)

        //  Super

        super.init(frame: .zero, textContainer: textContainer)

        self.textContainerInset = .zero

        //  Configure Text View

        layoutManager.delegate = self

        self.isScrollEnabled = false
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    //  Layout Manager

    func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByWordBeforeCharacterAt charIndex: Int) -> Bool {
        print(#function)

        return false
    }

    func layoutManager(_ layoutManager: NSLayoutManager, shouldBreakLineByHyphenatingBeforeCharacterAt charIndex: Int) -> Bool {
        print(#function)

        return false
    }

}

我在一个实际的应用程序中尝试了你的代码,文本视图占据了整个超级视图,如果初始字符串很长,shouldBreakLineByWordBeforeCharacterAt 在启动时被多次调用,然后每次用户输入时再次调用一个角色——完全符合预期。