Domanda

Come faccio a disattivare l'opzione "Usa dimensioni ridotte" nella barra degli strumenti? Sto usando Xcode 4.

(che è l'opzione che appare quando gli utenti vanno a personalizzare la barra degli strumenti).

È stato utile?

Soluzione

Si potrebbe sottoclasse NSToolbar, override -setSizeMode: e nella chiamata implementazione [super setSizeMode: NSToolbarSizeModeRegular];.

Se stai istanziare la barra degli strumenti in Interface Builder quindi assicurarsi che si assegna la sottoclasse alla barra degli strumenti nel pennino.

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

Questo non rimuoverà la casella di controllo dal pannello di personalizzazione, ma gli impedirà di fare qualsiasi cosa.

Ci non è davvero un modo supportato per rimuovere la casella di controllo. Questo funziona ma è abbastanza hacky:

//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];
            }
        }
    }
}

Altri suggerimenti

Se non stai distribuendo sul Mac App Store, e non vi dispiace sottoclasse metodi privati, è possibile creare un NSToolbarSubclass e di override _allowsSizeMode: a NO ritorno:

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

Questo ha il vantaggio di eliminare la casella di controllo dal foglio di personalizzazione, come bene.

Grazie a Rob Keniger per l'ottimo inizio. Se si può avere la barra degli strumenti personalizzata come un delegato della finestra, si può evitare di avere "Usa dimensioni ridotte" visibile da ottenere il foglio prima che venga visualizzata sullo schermo. A tale scopo, l'attuazione [finestra NSToolbar: willPositionSheet: usingRect:] nella classe barra degli strumenti personalizzata. Altrove nel codice, è necessario fare:

[myWindowWithToolbar setDelegate:myInstanceOfXXToolbar];

Ecco la classe barra degli strumenti personalizzata aggiornamento:

@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

Spero hai trovato utile.

Ecco una versione Swift 2.2 di @ soluzione macgreg. È possibile mantenere il vostro NSWindowDelegate dove volete, basta garantire almeno i seguenti si chiama:

var toolbar: UniformToolbar!

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

    toolbar.removeSizeToggle(window: sheet)

    return rect
}

Barra degli strumenti di sottoclasse senza la casella di controllo

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()
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top