2013-02-01 33 views
8

Tôi đang cố gắng tạo một NSTextField theo chương trình.Chiều rộng NSTextField và tự động trả lời

Tôi muốn sử dụng NSTextField này với bố cục tự động, do đó chiều rộng của nó sẽ được xác định tự động để hiển thị toàn bộ dòng (chỉ có một dòng văn bản).

Vấn đề là textField.intrinsicContentSizetextField.fittingSize đều có -1 và 0 giá trị cho ngang phối hợp, như đầu ra của mã dưới đây là: textField.intrinsicContentSize={-1, 21} textField.fittingSize={0, 21}

Mã:

NSTextField* textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 10, 24)];  
NSString* str = @"One line of text here."; 
[textField setStringValue: str]; 
[textField setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[textField invalidateIntrinsicContentSize]; 

NSLog(@"textField.intrinsicContentSize=%@", NSStringFromSize(textField.intrinsicContentSize)); 
NSLog(@"textField.fittingSize=%@", NSStringFromSize(textField.fittingSize)); 

Điều này làm cho trường văn bản có độ rộng bằng 0 do bố cục tự động gán.

Tôi nên làm gì để nhận các giá trị có ý nghĩa cho các thuộc tính fittingSizeintrinsicContentSize của trường văn bản để chúng phản ánh nội dung của trường văn bản?

+4

Điều này được giải quyết tại đây: http://stackoverflow.com/q/20809622/210171 (Bạn phải đặt editable = false cho trường văn bản thành tự động kích thước) – nielsbot

Trả lời

4

Một cách khác để tính toán các lĩnh vực văn bản chiều rộng tối ưu mà không sử dụng fittingSize đang sử dụng sau mã (thay thế phương thức sizeTextFieldWidthToFit của John Sauer):

- (void) sizeTextFieldWidthToFit { 
    [textField sizeToFit]; 
    CGFloat newWidth = NSWidth(textField.frame); 
    textFieldWidthConstraint.constant = newWidth; 
} 

Bạn có thể đặt mức độ ưu tiên của textFieldWidthConstraint phải thấp hơn ưu tiên của bất bình đẳng khác hạn chế việc đại diện cho yêu cầu của bạn với kích thước tối thiểu là 25.

2

Tôi không thể giải thích tại sao chiều rộng nội tại của NSTextField làContentSize là -1, nhưng tôi có thể tính toán dựa trên kích thước của thuộc tính này. Đây là cách tôi tạo ra NSTextField:

// textField is an instance variable. 
textField = [NSTextField new] ; 
textField.translatesAutoresizingMaskIntoConstraints = NO ; 
[view addSubview:textField] ; 

NSDictionary* viewsDict = NSDictionaryOfVariableBindings(view, textField) ; 
// textFieldWidthConstraint is an instance variable. 
textFieldWidthConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[textField(==0)]" options:0 metrics:nil views:viewsDict] [0] ; 
[view addConstraint:textFieldWidthConstraint] ; 
NSNumber* intrinsicHeight = @(textField.intrinsicContentSize.height) ; 
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[textField(==intrinsicHeight)]" options:0 metrics:NSDictionaryOfVariableBindings(intrinsicHeight) views:viewsDict]] ; 

// Position textField however you like. 
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[textField]" options:0 metrics:nil views:viewsDict]] ; 
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[textField]" options:0 metrics:nil views:viewsDict]] ; 

[self sizeTextFieldWidthToFit] ; 
// set textField's delegate so that sizeTextFieldWidthToFit is called when textField's text changes. 
textField.delegate = self ; 

Và đây là các phương pháp thay đổi kích thước nó như là thay đổi văn bản của nó:

- (void) controlTextDidChange:(NSNotification*)aNotification { 
    if (aNotification.object == textField) 
     [self sizeTextFieldWidthToFit] ; 
} 

- (void) sizeTextFieldWidthToFit { 
    // I'd like the width to always be >= 25. 
    CGFloat newWidth = 25 ; 
    if (! [textField.stringValue isEqualToString:@""]) { 
     NSDictionary* attributes = [textField.attributedStringValue attributesAtIndex:0 effectiveRange:nil] ; 
     NSSize size = [textField.stringValue sizeWithAttributes:attributes] ; 
     newWidth = MAX(newWidth, size.width + 10) ; 
    } 
    textFieldWidthConstraint.constant = newWidth ; 
} 
+0

Cảm ơn. Để tính toán chiều rộng theo cách thủ công, tôi đã có thể sử dụng [textField sizeToFit] tiếp theo là nhận được độ rộng khung điều khiển (yêu cầu mã ngắn hơn nhiều). –

+0

Bạn có thể đăng mã đó làm câu trả lời không? Vì nó hoạt động và ngắn hơn nhiều, nên có lẽ đó là câu trả lời được chấp nhận. –

+0

Xin lỗi, tôi không nhận thấy rằng chỉ có ba dòng trong giải pháp của bạn thực sự được sử dụng để tính toán chiều rộng tối ưu, vì vậy cuối cùng giải pháp của tôi không ngắn hơn nhiều, nhưng tôi đã đăng nó như một giải pháp thay thế có thể. –

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