Автоматически изменять размер NSButton для соответствия программно измененному тексту (Xcode)

У меня есть NSButton (кнопка) с некоторым временным текстом заголовка, встроенным в Interface Builder/Xcode. В другом месте текст заголовка внутри кнопки программно изменяется на строку неизвестной длины (фактически, много раз на разную длину).

Я бы хотел, чтобы кнопка автоматически изменялась (с фиксированной правой позицией - так она растет влево), чтобы соответствовать любой длине строки, программно вставленной как текст кнопки. Но я не могу понять. Какие-либо предложения? Спасибо заранее!

Ответ 1

Если вы не можете использовать автоматический макет, предложенный @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

Таким образом, вы можете просто установить класс кнопки RKSizeToFitButton в Interface Builder, а затем вызвать setStringValue: на кнопке, чтобы изменить его метку, будет "просто работать" без дополнительного кода.

Ответ 2

Конечно! Просто используйте Автомат!:)