Настроить NSToolbar - отключить использование маленького размера

Как отключить параметр «Использовать маленький размер» на панели инструментов? Я использую Xcode 4.

(Это вариант, который появляется, когда пользователи переходят к настройке панели инструментов.)


person janeh    schedule 02.12.2011    source источник


Ответы (4)


Вы можете создать подкласс NSToolbar, переопределить -setSizeMode: и в своей реализации вызвать [super setSizeMode: NSToolbarSizeModeRegular];.

Если вы создаете экземпляр панели инструментов в Interface Builder, убедитесь, что вы назначили свой подкласс панели инструментов в кончике пера.

@implementation RKToolbar
- (void)setSizeMode:(NSToolbarSizeMode)aSizeMode
{
    [super setSizeMode:NSToolbarSizeModeRegular];
}
@end

Это не удалит флажок с панели настройки, но предотвратит какие-либо действия.

На самом деле не существует поддерживаемого способа снять флажок. Это работает, но довольно хакерски:

//in your NSToolbar subclass
- (void)runCustomizationPalette:(id)sender
{
    [super runCustomizationPalette:sender];

    NSWindow* toolbarWindow = [NSApp mainWindow];

    NSWindow* sheet = [toolbarWindow attachedSheet];

    for(NSView* view in [[sheet contentView] subviews])
    {
        if([view isKindOfClass:[NSButton class]])
        {
            if([[[(NSButton*)view cell] valueForKey:@"buttonType"] integerValue] == NSSwitchButton)
            {
                [view setHidden:YES];
            }
        }
    }
}
person Rob Keniger    schedule 02.12.2011
comment
спасибо за предложение! (было бы было бы неплохо вообще скрыть коробку...) - person janeh; 02.12.2011
comment
пс. Я пошел в Файл > Открыть быстро..., чтобы увидеть, какой класс определяет поле "Использовать малый размер", но я не вижу его в NSToolbar.h. Где это делается? - person janeh; 02.12.2011
comment
Я добавил код, чтобы скрыть флажок. Это не идеально (флажок изначально виден, но исчезает после открытия листа), но он работает. - person Rob Keniger; 02.12.2011
comment
Разве вы не сможете переключиться на маленький размер, щелкнув правой кнопкой мыши на панели инструментов? Я хотел бы создать панель инструментов, подобную XCode, где вы можете выбирать между текстом, значком и обоими, но другие варианты скрыты... - person Bob Vork; 22.08.2013

Если вы не распространяете через Mac App Store и не возражаете против создания подклассов приватных методов, вы можете создать NSToolbarSubclass и переопределить _allowsSizeMode:, чтобы вернуть NO:

- (BOOL)_allowsSizeMode:(NSToolbarSizeMode)mode {
    return mode != NSToolbarSizeModeSmall;
}

Это также дает дополнительное преимущество, заключающееся в удалении флажка с листа настройки.

person Wevah    schedule 01.01.2014

Спасибо Робу Кенигеру за отличный старт. Если вы можете использовать свою настраиваемую панель инструментов в качестве делегата вашего окна, вы можете избежать отображения «Использовать малый размер», получив лист до его отображения на экране. Сделайте это, реализуя [окно NSToolbar: willPositionSheet:usingRect:] в пользовательском классе панели инструментов. В другом месте вашего кода вам нужно будет сделать:

[myWindowWithToolbar setDelegate:myInstanceOfXXToolbar];

Вот обновленный класс пользовательской панели инструментов:

@implementation XXToolbar

- (void)setSizeMode:(NSToolbarSizeMode)aSizeMode
{
    [super setSizeMode:NSToolbarSizeModeRegular];
}

- (NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect {
    NSView *buttonView = nil;

    for(NSView* view in [[sheet contentView] subviews])
    {
        if([view isKindOfClass:[NSButton class]])
        {
            if([[[(NSButton*)view cell] valueForKey:@"buttonType"] integerValue] == NSSwitchButton)
            {
                buttonView = view;
                break;
            }
        }
    }

    if (buttonView) {
        [buttonView setHidden:YES];

        // This is important as it causes the sheet to redraw without the button off screen
        [[sheet contentView] display];
    }

    return rect;
}

@end

Надеюсь, вы найдете это полезным.

person MacGreg    schedule 02.05.2012

Вот версия решения @MacGreg для Swift 2.2. Вы можете хранить свой NSWindowDelegate где угодно, просто убедитесь, что вызывается по крайней мере следующее:

var toolbar: UniformToolbar!

func window(window: NSWindow, willPositionSheet sheet: NSWindow, usingRect rect: NSRect) -> NSRect {

    toolbar.removeSizeToggle(window: sheet)

    return rect
}

Подкласс панели инструментов без флажка

class UniformToolbar: NSToolbar {

    override var sizeMode: NSToolbarSizeMode {
        get {
            return NSToolbarSizeMode.Regular
        }
        set { /* no op */ }
    }

    func removeSizeToggle(window window: NSWindow) {

        guard let views = window.contentView?.subviews else { return }

        let toggle: NSButton? = views.lazy
            .flatMap({ (view: NSView) -> NSButton? in view as? NSButton })
            .filter({ (button: NSButton) -> Bool in

                guard let buttonTypeValue = button.cell?.valueForKey("buttonType")?.unsignedIntegerValue,
                    buttonType = NSButtonType(rawValue: buttonTypeValue)
                    else { return false }

                return buttonType == .SwitchButton
            })
            .first

        toggle?.hidden = true
        window.contentView?.display()
    }
}
person ctietze    schedule 14.06.2016