2012-05-05 34 views

Trả lời

42

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]; 
} 
+2

Đ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 độ. –

+0

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

+2

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

1

Câu trả lời được chấp nhận dựa trên thao tác intrinsicContentSize nhưng điều đó có thể không cần thiết trong mọi trường hợp. Autolayout sẽ phát triển và thu nhỏ chiều cao của trường văn bản nếu (a) bạn cung cấp cho trường văn bản preferredMaxLayoutWidth và (b) tạo trường không phải là editable. Các bước này cho phép trường văn bản xác định chiều rộng nội tại của nó và tính toán chiều cao cần thiết cho autolayout. Xem this answerthis answer để biết thêm chi tiết.

Thậm chí còn tối hơn, nó phụ thuộc vào sự phụ thuộc vào thuộc tính editable của trường văn bản mà tính năng tự động xóa sẽ bị ngắt nếu bạn đang sử dụng các liên kết trên trường và không xóa tùy chọn Conditionally Sets Editable.

Các vấn đề liên quan