2012-05-05 4 views

답변

42

intrinsicContentSizeNSView의 메소드는 뷰 자체의 고유 내용 크기를 반환합니다.

NSTextField은 셀의 wraps 속성을 고려하지 않고이 값을 계산하므로 한 줄에 텍스트를 배치하면 텍스트의 크기가보고됩니다. 허용 대답은 intrinsicContentSize하지만 그 수도를 조작을 기반으로

-(NSSize)intrinsicContentSize 
{ 
    if (![self.cell wraps]) { 
     return [super intrinsicContentSize]; 
    } 

    NSRect frame = [self frame]; 

    CGFloat width = frame.size.width; 

    // Make the frame very high, while keeping the width 
    frame.size.height = CGFLOAT_MAX; 

    // Calculate new height within the frame 
    // with practically infinite height. 
    CGFloat height = [self.cell cellSizeForBounds: frame].height; 

    return NSMakeSize(width, height); 
} 

// you need to invalidate the layout on text change, else it wouldn't grow by changing the text 
- (void)textDidChange:(NSNotification *)notification 
{ 
    [super textDidChange:notification]; 
    [self invalidateIntrinsicContentSize]; 
} 
+2

이것은 내가보고있는 것과 정확히 일치합니다. 명확하게하기 위해 셀 위의 '포장'속성을 무시하는 것이 Mountain Lion에서 수정 된 Lion의 버그 인 것 같습니다. 따라서 라이온 이상을 타겟팅하는 경우 버그 수정을 적용하여 라이온을 신속하게 유도 할 때까지 2 개의 OS에서 서로 다른 결과를 볼 수 있습니다. –

+0

예, 이것은 Lion의 버그입니다. 애플이 OS X 10.7 및 10.8에서이 문제를 해결하기를 바란다. 저의 경우, 특별한 경우 (예를 들어, 라이온 인 경우 언어가 영어가 아닌 경우)에 좀 더 검사를 실시하고 신장을 약간 달리 설정합니다. 그럼에도 불구하고 Monolo가 게시 한 것은 좋은 시작입니다. – Arvin

+2

intrinsicContentSize : 메서드는 setStringValue :로 텍스트를 변경하면 호출되지 않습니다. – ideawu

1

:

따라서,이 메소드를 오버라이드 (override) 할 수 NSTextField의 사용자 지정 하위 클래스는 셀의 cellSizeForBounds: 방법에 의해 제공되는 하나로서, 더 나은 값을 반환합니다 모든 경우에 필요하지는 않습니다. Autolayout은 (a) 텍스트 필드에 preferredMaxLayoutWidth을주고 (b) 필드가 editable이 아닌 경우 텍스트 필드의 높이를 늘리고 줄입니다. 이 단계를 통해 텍스트 필드에서 본질적인 너비를 결정하고 자동 레이아웃에 필요한 높이를 계산할 수 있습니다. 자세한 내용은 this answerthis answer을 참조하십시오.

텍스트 필드의 editable 특성에 대한 종속성 때문에 필드에 바인딩을 사용하고 Conditionally Sets Editable 옵션을 지우지 않으면 autolayout이 중단됩니다.

관련 문제