Lion의 자동 레이아웃은 텍스트 필드 (및 레이블)가 보유하는 텍스트가 커지도록하는 것이 매우 간단해야합니다.자동 레이아웃의 텍스트와 함께 NSTextField가 커지도록하려면 어떻게해야합니까?
텍스트 필드는 Interface Builder에서 줄 바꾸기로 설정됩니다.
이렇게 간단하고 안정적인 방법은 무엇입니까?
Lion의 자동 레이아웃은 텍스트 필드 (및 레이블)가 보유하는 텍스트가 커지도록하는 것이 매우 간단해야합니다.자동 레이아웃의 텍스트와 함께 NSTextField가 커지도록하려면 어떻게해야합니까?
텍스트 필드는 Interface Builder에서 줄 바꾸기로 설정됩니다.
이렇게 간단하고 안정적인 방법은 무엇입니까?
intrinsicContentSize
NSView
의 메소드는 뷰 자체의 고유 내용 크기를 반환합니다.
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];
}
:
따라서,이 메소드를 오버라이드 (override) 할 수 NSTextField
의 사용자 지정 하위 클래스는 셀의 cellSizeForBounds:
방법에 의해 제공되는 하나로서, 더 나은 값을 반환합니다 모든 경우에 필요하지는 않습니다. Autolayout은 (a) 텍스트 필드에 preferredMaxLayoutWidth
을주고 (b) 필드가 editable
이 아닌 경우 텍스트 필드의 높이를 늘리고 줄입니다. 이 단계를 통해 텍스트 필드에서 본질적인 너비를 결정하고 자동 레이아웃에 필요한 높이를 계산할 수 있습니다. 자세한 내용은 this answer 및 this answer을 참조하십시오.
텍스트 필드의 editable
특성에 대한 종속성 때문에 필드에 바인딩을 사용하고 Conditionally Sets Editable
옵션을 지우지 않으면 autolayout이 중단됩니다.
이것은 내가보고있는 것과 정확히 일치합니다. 명확하게하기 위해 셀 위의 '포장'속성을 무시하는 것이 Mountain Lion에서 수정 된 Lion의 버그 인 것 같습니다. 따라서 라이온 이상을 타겟팅하는 경우 버그 수정을 적용하여 라이온을 신속하게 유도 할 때까지 2 개의 OS에서 서로 다른 결과를 볼 수 있습니다. –
예, 이것은 Lion의 버그입니다. 애플이 OS X 10.7 및 10.8에서이 문제를 해결하기를 바란다. 저의 경우, 특별한 경우 (예를 들어, 라이온 인 경우 언어가 영어가 아닌 경우)에 좀 더 검사를 실시하고 신장을 약간 달리 설정합니다. 그럼에도 불구하고 Monolo가 게시 한 것은 좋은 시작입니다. – Arvin
intrinsicContentSize : 메서드는 setStringValue :로 텍스트를 변경하면 호출되지 않습니다. – ideawu