Как отключить параметр «Использовать маленький размер» на панели инструментов? Я использую Xcode 4.
(Это вариант, который появляется, когда пользователи переходят к настройке панели инструментов.)
Как отключить параметр «Использовать маленький размер» на панели инструментов? Я использую Xcode 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];
}
}
}
}
Если вы не распространяете через Mac App Store и не возражаете против создания подклассов приватных методов, вы можете создать NSToolbarSubclass
и переопределить _allowsSizeMode:
, чтобы вернуть NO
:
- (BOOL)_allowsSizeMode:(NSToolbarSizeMode)mode {
return mode != NSToolbarSizeModeSmall;
}
Это также дает дополнительное преимущество, заключающееся в удалении флажка с листа настройки.
Спасибо Робу Кенигеру за отличный старт. Если вы можете использовать свою настраиваемую панель инструментов в качестве делегата вашего окна, вы можете избежать отображения «Использовать малый размер», получив лист до его отображения на экране. Сделайте это, реализуя [окно 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
Надеюсь, вы найдете это полезным.
Вот версия решения @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()
}
}