Phương thức intrinsicContentSize
trong NSView
trả về nội dung mà chính chế độ xem là kích thước nội tại của nó.
NSTextField
tính toán điều này mà không xem xét thuộc tính wraps
của ô, do đó, nó sẽ báo cáo kích thước của văn bản nếu được đặt trong một dòng.
Do đó, một lớp con tùy chỉnh của NSTextField
có thể ghi đè phương pháp này để trả về một giá trị tốt hơn, chẳng hạn như một cung cấp bởi phương pháp của tế bào cellSizeForBounds:
:
-(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];
}
Điều này khớp chính xác với những gì tôi thấy. Chỉ cần làm rõ, điều này bỏ qua tài sản 'kết thúc tốt đẹp' trên tế bào dường như là một lỗi trong Sư tử đã được sửa chữa trong Mountain Lion. Vì vậy, nếu bạn đang nhắm mục tiêu Lion và ở trên, bạn sẽ thấy kết quả khác nhau trong 2 hệ điều hành cho đến khi bạn áp dụng các bugfix để mang lại cho Lion lên đến tốc độ. –
Vâng, đây là lỗi trong Lion. Tôi thực sự muốn Apple sẽ khắc phục những vấn đề này trong cả OS X 10.7 && 10.8. Trong quá trình thực hiện, tôi thực hiện một số kiểm tra khác cho các trường hợp đặc biệt (ví dụ: Nếu đó là Lion || Nếu ngôn ngữ không phải là tiếng Anh) và tôi đặt chiều cao của mình hơi khác một chút. Tuy nhiên, những gì Monolo đăng là một khởi đầu tốt. – Arvin
Phương thức intrinsicContentSize: không được gọi khi bạn thay đổi văn bản trong nó bằng setStringValue :. – ideawu