Wrap NSButton название - PullRequest
       14

Wrap NSButton название

8 голосов
/ 22 марта 2009

Любой способ иметь заголовок NSButton для переноса, когда его ширина больше ширины кнопки, вместо того, чтобы обрезаться?

Я пытаюсь установить переключатель с текстом, который может быть длинным и иметь несколько строк. Один из способов, которым я думал о том, чтобы он работал, - это иметь NSButton типа NSRadioButton, но не могу заставить работать несколько строк текста.

Может быть, моя лучшая альтернатива - иметь NSButton, за которым следует NSTextView с делегированной функцией mouseDown, вызывающей состояние NSButton?

Ответы [ 6 ]

7 голосов
/ 22 марта 2009

Я не верю, что ты можешь. Вам нужно создать подкласс NSButtonCell, чтобы добавить поддержку для этого.

Тем не менее, обычно плохая идея иметь несколько строк текста на кнопке. Метка кнопки должна кратко представлять выполненное действие:

Метка на кнопке должна быть глаголом или фразой глагола, описывающей выполняемое ею действие - Сохранить, Закрыть, Распечатать, Удалить, Изменить пароль и т. Д. Если кнопка действует на одну настройку, пометьте кнопку как можно точнее; Например, «Выбрать рисунок…» более полезен, чем «Выбор…». Поскольку кнопки запускают немедленное действие, нет необходимости использовать «сейчас» (например, «Сканировать сейчас») в метке.

Что вы пытаетесь сделать?

5 голосов
/ 12 февраля 2017

Я невероятно опоздал, но все еще чувствую себя обязанным поделиться тем, что нашел.

Просто добавьте символ новой строки до и после заголовка кнопки, прежде чем назначить его фактической кнопке - и вуаля! Теперь он переносится автоматически.

Недостатком этого подхода является то, что по неизвестным мне причинам приложения, скомпилированные для определенной версии OS X, нажимают кнопки смещения на одну строку ниже при запуске на более новых версиях.

4 голосов
/ 17 июля 2013

Вот мое оправдание необходимости использования многострочных кнопок: я пишу эмулятор для IBM 701 в комплекте с лицевой панелью, и, слава Богу, дизайнеры этой лицевой панели использовали многострочные метки. Вот мой код Вам нужно только создать подкласс NSButtonCell (не NSButton), и нужно переопределить только один метод.

// In Xcode 4.6 (don't know about earlier versions): Place NSButton, then double-click it
// and change class NSButtonCell to ButtonMultiLineCell.

@interface ButtonMultiLineCell : NSButtonCell

@end

@implementation ButtonMultiLineCell

- (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
{
    NSAttributedString *as = [[NSAttributedString alloc] initWithString:[title.string stringByReplacingOccurrencesOfString:@" " withString:@"\n"]];
    NSFont *sysFont = [NSFont systemFontOfSize:10];
    NSMutableParagraphStyle *paragraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
    [paragraphStyle setAlignment:NSCenterTextAlignment];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
      sysFont, NSFontAttributeName,
      paragraphStyle, NSParagraphStyleAttributeName,
      nil];
    NSSize textSize = [as.string sizeWithAttributes:attributes];
    NSRect textBounds = NSMakeRect(0, 0, textSize.width, textSize.height);
    // using frame argument seems to produce text in wrong place
    NSRect f = NSMakeRect(0, (controlView.frame.size.height - textSize.height) / 2, controlView.frame.size.width, textSize.height);
    [as.string drawInRect:f withAttributes:attributes];
    return textBounds; // not sure what rectangle to return or what is done with it
}

@end
2 голосов
/ 10 апреля 2017

Даже позже, но я также чувствую себя обязанным поделиться. Вы можете установить свойство attributetitle NSButton для выполнения переноса вручную.

В моем случае я хотел, чтобы заголовок кнопки был перенесен, если он был длиннее 6 символов (Swift 3):

if button.title.characters.count > 6 {
    var wrappedTitle = button.title
    wrappedTitle.insert("\n", at: wrappedTitle.index(wrappedTitle.startIndex, offsetBy: 6))
    let style = NSMutableParagraphStyle()
    style.alignment = .center
    let attributes = [NSFontAttributeName: NSFont.systemFont(ofSize: 19), NSParagraphStyleAttributeName: style] as [String : Any]
    button.attributedTitle = NSAttributedString(string: wrappedTitle, attributes: attributes)
}
1 голос
/ 12 мая 2019

На сегодняшний день я вижу, что это можно сделать просто с помощью свойства в ячейке NSButton:

myButton.cell?.wraps = true

1 голос
/ 24 марта 2009

Я с Сореном; Если вам нужно более длинное описание, подумайте об использовании всплывающей подсказки или размещении описательного текста в обернутом текстовом поле с использованием маленького системного шрифта под опциями выбора радио, если описательный текст состоит всего из нескольких строк. В противном случае вы можете предоставить дополнительную информацию в справочном документе.

Лучше всего найти способ сказать, что вам нужно сказать в сжатой форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...