2

如何禁用工具栏中的“使用小尺寸”选项?我正在使用 Xcode 4。

(这是用户自定义工具栏时出现的选项。)

4

4 回答 4

4

如果您不在 Mac App Store 上分发,并且不介意子类化私有方法,您可以创建一个NSToolbarSubclass并覆盖_allowsSizeMode:返回NO

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

这还具有从自定义表中删除复选框的额外好处。

于 2014-01-01T14:18:23.810 回答
2

您可以继承NSToolbar、覆盖-setSizeMode:和在您的实现调用[super setSizeMode: NSToolbarSizeModeRegular];中。

如果您在 Interface Builder 中实例化工具栏,请确保将子类分配给 nib 中的工具栏。

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

这不会从自定义面板中删除复选框,但会阻止它执行任何操作。

没有真正支持的方式来删除复选框。这确实有效,但它非常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];
            }
        }
    }
}
于 2011-12-02T13:36:25.673 回答
2

感谢 Rob Keniger 的出色开端。如果您可以将自定义工具栏作为窗口的代表,则可以通过在屏幕上显示之前获取工作表来避免“使用小尺寸”可见。通过在自定义工具栏类中实现 [NSToolbar window: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

希望您觉得这个有帮助。

于 2012-05-02T15:30:14.543 回答
0

这是@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()
    }
}
于 2016-06-14T14:25:25.303 回答