2016-12-26 4 views
-1

テキスト内でソフト改行がどこで発生するかを定義しようとしています。NSLayoutManagerDelegateメソッドlayoutManager(_:shouldBreakLineByWordBeforeCharacterAt:)は、開始する場所のようです。私の問題は、私の他の方法はありますが、呼び出されていないということです。これは基本的なUITextViewセットアップで発生しています。どのような条件の下でこのメソッドが呼び出されます - 私は正しい場所を探していますか?私は全体のスーパーを占有テキストビューで、実際のアプリで、あなたのコードを試みたが、最初の文字列がある場合shouldBreakLineByWordBeforeCharacterAtは起動時に複数回呼び出され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

:ここ

は私のTextKitスタックは次のようになります。ユーザーが文字を入力するたびに、いつもと同じように、長い、そして再び、

+0

それはまさにそれです、Playgroundsは実際のアプリを使って問題を解読していました。あなたは知識があるように思えるので、私が本当にやろうとしているのは絶対的なキャラクターの配置です。私の最初のアイデアは 'shouldBreakLineByWordBeforeCharacterAt'を使用して改行が発生する場所を決定し、' NSTextContainer.lineFragmentRect(forProposedRect:) 'が 'lines'の配置方法を決定することでした。これは良いアプローチですか? – mattsven

+0

"私が実際にやろうとしているのは絶対的なキャラクターの位置づけです"それは別の(そして興味深い)質問です。 – matt

関連する問題