【问题标题】:Customize NSToolbar - Disable "Use small size"自定义 NSToolbar - 禁用“使用小尺寸”
【发布时间】:2011-12-02 03:12:12
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c xcode cocoa customization nstoolbar


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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];
                  }
              }
          }
      }
      

      【讨论】:

      • 感谢您的建议! (完全隐藏盒子很好...)
      • ps。我去了文件>快速打开...查看哪个类定义了“使用小尺寸”框,但我在 NSToolbar.h 下看不到它。在哪里做的?
      • 我添加了一些代码来隐藏复选框。它并不完美(复选框最初是可见的,但一旦打开工作表就会消失)但它确实有效。
      • 难道你还不能通过右键单击工具栏来切换到小尺寸吗?我想制作一个像 XCode 一样的工具栏,您可以在其中选择文本、图标和两者,但其他选项被隐藏...
      【解决方案3】:

      感谢 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
      

      希望你觉得这很有用。

      【讨论】:

        【解决方案4】:

        这是@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()
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-07
          • 2013-11-21
          • 1970-01-01
          • 1970-01-01
          • 2014-10-17
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多