【问题标题】:Automatically resize an NSButton to fit programmatically changed text (Xcode)自动调整 NSButton 的大小以适应以编程方式更改的文本 (Xcode)
【发布时间】:2011-11-04 23:13:48
【问题描述】:

我有一个 NSButton(按钮),其中包含一些在 Interface Builder / Xcode 中内置的临时标题文本。在其他地方,按钮内的标题文本以编程方式更改为未知长度的字符串(实际上,多次更改为许多不同的长度)。

我希望按钮自动调整大小(具有固定的右侧位置--因此它向左增长)以适应以编程方式作为按钮文本插入的任何长度的字符串。但我无法弄清楚。有什么建议?提前致谢!

【问题讨论】:

    标签: xcode cocoa macos interface-builder nsbutton


    【解决方案1】:

    当然!只需使用Auto Layout! :)

    【讨论】:

    • 我的错;我应该更清楚。如何在 10.6(及更早版本)中执行此操作?
    • @jtbandes 你如何使用自动布局来做到这一点?
    • @Jai 启用自动布局后,按钮将自动尝试设置正确的大小。你只需要告诉它在哪里——在 OP 的情况下,这意味着将其右(尾)边缘与超级视图对齐的约束。
    • 嗯..这就是我卡住的地方。如果按钮的右后沿与其父视图对齐,则按钮不会随着父视图的大小而增长。我想知道如何让按钮成为其文本的大小。对不起,如果我没有正确理解
    • 如果按钮的右边缘与超级视图对齐,但左边缘不受约束,它将适合其文本的大小并保持右对齐。
    【解决方案2】:

    如果您不能按照@jtbandes 的建议使用自动布局(它仅在 Lion 中可用),那么您可以在设置其字符串值后调用 [button sizeToFit],这将使按钮调整大小以适应其字符串。然后,您需要根据新宽度调整其框架。

    您不能自动执行此操作,但在 NSButton 的子类中执行此操作很容易。

    @implementation RKSizeToFitButton
    - (void)setStringValue:(NSString*)aString
    {
        //get the current frame
        NSRect frame = [self frame];
    
        //button label
        [super setStringValue:aString];
    
        //resize to fit the new string
        [self sizeToFit];
    
        //calculate the difference between the two frame widths
        NSSize newSize = self.frame.size;
        CGFloat widthDelta = newSize.width - NSWidth(frame);
        //set the frame origin
        [self setFrameOrigin:NSMakePoint(NSMinX(self.frame) - widthDelta, NSMinY(self.frame))];
    }
    @end
    

    这样,您只需在 Interface Builder 中将按钮的类设置为 RKSizeToFitButton,然后在按钮上调用 setStringValue: 以更改其标签即可“正常工作”,无需额外代码。

    【讨论】:

    • 该方法更合适的名称是setStringValueAndSizeToFit:
    • 当然,但我预计子类会被称为 RKSizeToFitButton 之类的名称,并且您根本不需要更改代码,因为它可以直接替代 @987654328 @。毕竟,OP 想要一种自动方法来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多