2014-06-13 4 views
6

NSView와 그 하위 뷰 NSTextView로 구성된 간단한 레이아웃이 있습니다. NSTextView는 프로그래밍 방식으로 여러 줄을 생성하는 일부 텍스트로 채워집니다. 자동 배치를 사용하여 모든 것을 하나로 묶습니다 (프로그래밍 방식으로 모두 완료). 그러나 모든 것이 표시되면 NSTextView가 잘 리기 때문에 한 줄만 표시됩니다.NSTextView가 자동 레이아웃으로 제대로 크기 조정되지 않습니다.

웹을 검색 한 후, 내가 찾을 수있는 가장 좋은 대답했다 :

Using Autolayout with expanding NSTextViews

하지만, 정말 내 사용하지 않습니다 모두가 표시된 후 내가 수동를 NSTextView의 텍스트를 변경하는 경우에만 이렇게 (케이스). 뷰가 재조정되고 전체 NSTextView가 표시됩니다.

NSTextView에서 invalidateIntrinsicContentSize을 호출 할 수 있도록 NSViewController가 서브 뷰를 배치 할 때를 파악하려고합니다. UIViewController에서 viewDidLayoutSubviews에 해당합니다.

아무 것도 시도하지 않았습니다. 내 텍스트

로를 NSTextView를 작성 후이를 수있는 더 나은 방법이 있나요 loadView

  • 의 끝에서

    • : 나는를 NSTextView에 대한 invalidateIntrinsicContentSize를 호출 시도한?

      1. 사용자 정의 NSView 서브 클래스 재정에서 invalidateIntrinsicContentSize

      이 또한 설명이 링크를 체크 아웃 호출 layout 방법을 NSTextView

    • 을 포함 NSView 서브 클래스를 생성합니다

  • 답변

    6

    더 연구 한 후, 답을 발견 자동 레이아웃 및 고유 콘텐츠 크기의 미묘함 (많은 다른 것들 중에서) :

    http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

    샘플 코드 : MyTextView의

    @interface MyView : NSView 
        @property MyTextView *textView; 
    @end 
    
    @implementation MyView 
    
    // init & create content & set constraints 
    
    -(void) layout { 
        [super layout]; 
        [self.textView invalidateIntrinsicContentSize]; 
    } 
    
    @end 
    

    구현 :

    @implementation MyTextView 
    
    - (NSSize) intrinsicContentSize { 
        NSTextContainer* textContainer = [self textContainer]; 
        NSLayoutManager* layoutManager = [self layoutManager]; 
        [layoutManager ensureLayoutForTextContainer: textContainer]; 
        return [layoutManager usedRectForTextContainer: textContainer].size; 
    } 
    
    - (void) didChangeText { 
        [super didChangeText]; 
        [self invalidateIntrinsicContentSize]; 
    } 
    
    @end 
    
    관련 문제