2016-12-26 9 views
-1

Я пытаюсь определить, где в моем тексте возникают мягкие разрывы строк, а метод NSLayoutManagerDelegatelayoutManager(_:shouldBreakLineByWordBeforeCharacterAt:) кажется местом для начала. Моя проблема заключается в том, что ее не называют, хотя мои другие методы. Это происходит с базовой настройкой UITextView. При каких условиях этот метод называется - я ищу подходящее место?Как решить, где возникают текстовые разрывы с TextKit?

Вот что мой стек 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 
    } 

} 
+0

@matt Обновлено. Стек не обязательно полностью настраивается, но - я только что установил делегат/ – mattsven

+0

@matt. Я пытался это сделать на Playground, используя живой просмотр. Может, так оно и есть? – mattsven

+1

Я умываю руки от всего этого. Игровые площадки - это работа дьявола. – matt

ответ

1

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

+0

Вот именно, игровые площадки пытались решить проблему, используя реальное приложение. Поскольку вы, кажется, знаете, что я действительно пытаюсь сделать, это абсолютно позиционные персонажи. Моя первоначальная идея заключалась в том, чтобы использовать 'shouldBreakLineByWordBeforeCharacterAt', чтобы решить, где происходят разрывы строк, и' NSTextContainer.lineFragmentRect (forProposedRect:) ', чтобы решить, как были расположены« линии ». Это хороший подход? – mattsven

+0

«То, что я действительно пытаюсь сделать, это абсолютно позиционные персонажи». Это будет отдельный (и интересный) вопрос. – matt