2017-12-21 14 views
0

私はアウトラインビューを編集したときにサイズ変更されるNSTextViewsを配置しています。私はこの作業のほとんどを持っていますが、いくつかの動作には一貫性がありません。私NSOutlineViewでIntrinsicContentSizeが正しくない高さに設定されたNSOutlineViewのNSTextView

私が設定:私はNSTextViewをサブクラス私の細胞ビューの場合

outlineView?.usesAutomaticRowHeights = true 

を。

self.translatesAutoresizingMaskIntoConstraints = false 
setContentHuggingPriority(NSLayoutConstraint.Priority.defaultHigh, for: NSLayoutConstraint.Orientation.vertical) 

そして私はNSTextViewに固有のコンテンツサイズの計算上書き:私は、次の自動レイアウトビットを設定(私は上記のコードでのlayoutManagerにensureLayoutを呼んでいたが、それは何も加えない

override var intrinsicContentSize: NSSize { 
     guard let manager = textContainer?.layoutManager else { 
      return .zero 
     } 
     print("\(manager.usedRect(for: textContainer!).size) \(string)") 
     return manager.usedRect(for: textContainer!).size 
    } 

を)

intrinsicContentSizeは、アウトライナーに追加されるときにテキストビューごとに2回呼び出されます。最初に返されるサイズは正しいですが、2回目の呼び出しでテキストの一部が不必要に折り返されます。 4つのテキストビューに対するintrinsicContentSizeの2回のパスの出力を以下に示します。列の幅は281なので、これらの文字列のいずれも折り返す必要はありません。彼らはすべて1行(14高い)に収まる最初のパスは、2回目のパスで、最後の2つの文字列が、彼らが最も長い文字列ではないので、奇妙である、ラップ:

(178.744140625, 14.0) New pointwddwek kelekwelek... 
(100.720703125, 14.0) Related Subjects 
(119.400390625, 14.0) Related Publications 
(87.150390625, 14.0) Related Terms 

(178.744140625, 14.0) New pointwddwek kelekwelek... 
(100.720703125, 14.0) Related Subjects 
(74.705078125, 28.0) Related Publications 
(54.484375, 28.0) Related Terms 

それは一貫して同じ文字列であること同じ動作になります。例えば。 "Related Subjects"という文字列はラップされず、 "Related Terms"という文字列は常にラップされます。

ビューが表示されると、usedRectの値が意味するものであっても、テキストは実際にはラップされません。テキストは正しく表示されますが、アウトライナの行ビューは2行のテキストがあると考えられるので高すぎます。

enter image description here

私は何かが足りない可能性があります任意のポインタ? 'ensureLayout'は何らかの形で前回の計算を参照していますが、最後に計算した幅に同じ文字列をフィッティングするときに丸めの問題がありますか?

答えて

0

ここで重要な点は、テキストが正しく表示されたが、ビューのサイズが間違っていたことだった。

NSTextViewのlayoutManagerのためのdelagateを作成しました。 NSTextViewがNSOutlineViewに追加された後、テキストが3回設定されていました(これはひどく非効率的です)。 intrinsicContentSizeは、最初の2つのテキストレイアウトの後にNSTextViewで呼び出されていました。

layoutManager内からinvalidateIntrinsicContentSizeを呼び出す:didCompleteLayoutFor ...すべてを修正しました。

私はここでも何が起こっているのか理解できませんし、なぜこれらのメソッドが何度も何度も呼び出されています。オートレイアウトの複雑さや物事を互いに押しつけることがそれであると思います。

また、処理中に計算の一部だけが間違っている理由もわかりません。

誰かがこれに光を当てることができるなら、ここでコメントしてください!

関連する問題