Как решить, где в 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
    }

}

person mattsven    schedule 26.12.2016    source источник
comment
@матовый Обновлено. Однако стек не обязательно полностью настраиваемый - я только что установил делегат/   -  person mattsven    schedule 26.12.2016
comment
@matt Я пробовал это на Playground, используя просмотр в реальном времени. Возможно, это все?   -  person mattsven    schedule 26.12.2016
comment
Я умываю руки от всего этого. Детские площадки - дело рук дьявола.   -  person matt    schedule 26.12.2016


Ответы (1)


Я попробовал ваш код в реальном приложении, где текстовое представление занимало все суперпредставление, а shouldBreakLineByWordBeforeCharacterAt вызывается несколько раз при запуске, если исходная строка длинная, а затем снова каждый раз, когда пользователь вводит символ — точно так, как и ожидалось.

person matt    schedule 26.12.2016
comment
Вот именно, Playgrounds придумывал проблему, используя реальное приложение, сработало. Поскольку вы, кажется, хорошо осведомлены, то, что я действительно пытаюсь сделать, это абсолютно позиционировать персонажей. Моя первоначальная идея состояла в том, чтобы использовать shouldBreakLineByWordBeforeCharacterAt, чтобы решить, где происходят разрывы строк, и NSTextContainer.lineFragmentRect(forProposedRect:), чтобы решить, как позиционировать «линии». Хороший ли это подход? - person mattsven; 26.12.2016
comment
то, что я действительно пытаюсь сделать, это абсолютное позиционирование персонажей. Это был бы отдельный (и интересный) вопрос. - person matt; 26.12.2016