2017-12-21 35 views
0

편집 할 때 NSTextViews를 넣을 outlineView가 있습니다 (outliner app를 생각하십시오). 대부분의 작업이 있지만 일부 동작이 일치하지 않습니다. 내 NSOutlineView에IntrinsicContentSize가 잘못된 높이로 설정되어있는 NSOutlineView의 NSTextView

나는 설정 : 내 세포 뷰에 대한

outlineView?.usesAutomaticRowHeights = true 

나는를 NSTextView를 서브 클래스. 나는 다음과 같은 자동 레이아웃 비트 설정 :

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

을 그리고 나는를 NSTextView의 고유 컨텐츠 크기 계산을 오버라이드 (override) :

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 
    } 

(I 위의 코드에서의 layoutManager에 ensureLayout를 호출되었지만 그것은 아무것도 추가하지)

intrinsicContentSize가 아웃 라이너에 추가 될 때 텍스트보기 당 두 번 호출됩니다. 반환 된 크기가 처음에는 정확하지만 두 번째 호출에서 텍스트 중 일부가 불필요하게 줄 바꿈됩니다. intrinsicContentSize에서 네 가지 텍스트보기에 대한 두 패스의 출력이 아래에 나와 있습니다. 열 너비는 281이므로이 문자열 중 어느 것도 감싸지 않아야합니다. 그들은 모두 한 줄 (14 으)로 맞는 첫 번째 패스, 두 번째 패스, 마지막 두 개의 문자열은 가장 긴 문자열이되지 않기 때문에 이상하다, 포장 :

(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 

그것은 지속적으로 같은 문자열입니다 같은 행동을합니다. 예 : "관련 주제"라는 문자열은 줄 바꿈되지 않으며 "관련 용어"라는 문자열은 항상 줄 바꿈됩니다.

뷰가 표시되면 usedRect 값이 의미하는 것처럼 텍스트가 실제로 래핑되지 않습니다. 텍스트가 올바르게 표시되지만 아웃 라이너의 행보기에는 두 줄의 텍스트가 있다고 생각되어 너무 높습니다.

enter image description here

내가 뭔가를 누락 될 수 있습니다 모든 포인터는? 'ensureLayout'은 어떻게 든 이전 계산을 참조한 다음 동일한 문자열을 마지막 계산 된 너비에 맞출 때 문제를 반올림합니까?

답변

0

여기 키는 텍스트가 올바르게 표시되었지만보기의 크기가 잘못되었습니다.

NSTextView의 layoutManager에 대한 설명단을 만들었습니다. 이 텍스트는 NSTextView가 NSOutlineView에 추가 된 후 3 번 설정되었습니다 (이는 대단히 비효율적 인 것 같습니다!). intrinsicContentSize는 처음 두 텍스트 레이아웃 이후에만 NSTextView에서 호출되었습니다.

layoutManager에서 invalidateIntrinsicContentSize를 호출합니다. didCompleteLayoutFor ... 모든 것을 수정했습니다.

나는 아직도 여기에서 무슨 일이 일어나고 있는지 이해하지 못한다. 왜 그런 것들이 여러 번 부름을 받았 는가? 자동 레이아웃의 복잡성과 서로 대치하는 것과 관련이 있다고 생각합니다.

왜 계산 중에 일부 계산 만 잘못되었는지 이해할 수 없습니다.

누구나이 부분을 밝힐 수 있다면 여기에 의견을 남기십시오!