Вопрос по cocoa – Как позволить NSTextField расти с текстом в автоматическом макете?

35

Автоматическое расположение в Lion должно позволить довольно просто позволить текстовому полю (и, следовательно, метке) расти вместе с текстом, который он содержит.

В Интерфейсном Разработчике текстовое поле установлено для переноса.

Какой простой и надежный способ сделать это?

Ваш Ответ

3   ответа
45

intrinsicContentSizeNSView

NSTextFieldwraps

NSTextFieldcellSizeForBounds:

-(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];
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

intrinsicContentSizepreferredMaxLayoutWidtheditable

editableConditionally Sets Editable

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

Swift 4 Editable Autosizing NSTextField

Based on Peter Lapisu's Objective-C post

Error: User Rate Limit ExceededNSTextFieldError: User Rate Limit Exceeded

override var intrinsicContentSize: NSSize {
    // Guard the cell exists and wraps
    guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}

    // Use intrinsic width to jive with autolayout
    let width = super.intrinsicContentSize.width

    // Set the frame height to a reasonable number
    self.frame.size.height = 750.0

    // Calcuate height
    let height = cell.cellSize(forBounds: self.frame).height

    return NSMakeSize(width, height);
}

override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    super.invalidateIntrinsicContentSize()
}

Error: User Rate Limit Exceededself.frame.size.heightError: User Rate Limit ExceededavoidsError: User Rate Limit ExceededFLT_MAX, CGFloat.greatestFiniteMagnitudeError: User Rate Limit ExceededNSTextFieldError: User Rate Limit ExceededNSTextFieldError: User Rate Limit Exceededself.frame.size.heightError: User Rate Limit Exceeded

Похожие вопросы