9

我将 NSButtonCell 子类化以自定义绘图(可自定义主题)。我想自定义复选框和单选按钮的绘制方式。

有谁知道如何检测按钮是复选框还是单选按钮?

只有 -setButtonType:,没有 getter,而且 -showsStateBy 和 -highlightsBy 似乎都没有为复选框提供任何唯一的返回值,这些复选框也不适用于带有图像和备用图像的常规按钮。

到目前为止,我已经找到了两个(不是很漂亮)的解决方法,但它们可能会让应用程序被 MAS 拒绝:

  1. 使用 [self valueForKey: @"buttonType"]。这可行,但由于该方法不在标题中,我认为这是 Apple 不希望我做的事情。

  2. 覆盖 -setButtonType: 和 -initWithCoder: 以在手动或从 XIB 设置按钮类型时跟踪它。这里的问题是 XIB 案例,因为用于将按钮类型保存到磁盘的键没有记录。再说一次,我将使用私有 API。

我真的很希望这是 NSButtonCell 的直接替代品,而不是强制客户端代码对复选框使用单独的 ULIThemeSwitchButtonCell 类,对单选按钮使用第三个类。

4

3 回答 3

2

按钮对其样式一无所知。

从 NSButton 上的文档

请注意,没有 -buttonType 方法。set 方法设置各种按钮属性,这些属性共同建立了类型的行为。-

您可以使用 tag: 和 setTag: (由 NSButton 从 NSControl 继承)来将按钮标记为复选框或单选按钮。如果您以编程方式执行此操作,那么您应该定义您使用的常量。您也可以在 Interface Builder 中设置标签,但只能作为整数值(幻数)。

于 2013-08-16T16:26:07.940 回答
0

在 initWithCoder 中,这是我对 BGHUDButtonCell.m 解决方案的改编,针对 Mac OS Sierra 进行了更新:

-(id)initWithCoder:(NSCoder *)aDecoder {

   if ( !(self = [super initWithCoder: aDecoder]) ) return nil;

   NSImage *normalImage = [aDecoder decodeObjectForKey:@"NSNormalImage"];
   if ( [normalImage isKindOfClass:[NSImage class]] )
   {
      DLog( @"buttonname %@", [normalImage name] );
      if ( [[normalImage name] isEqualToString:@"NSSwitch"] )
         bgButtonType = kBGButtonTypeSwitch;
      else if ( [[normalImage name] isEqualToString:@"NSRadioButton"] )
         bgButtonType = kBGButtonTypeRadio;
   }
   else
   {
      // Mac OS Sierra update (description has word "checkbox")
      NSImage *img = [self image];
      if ( img && [[img description] rangeOfString:@"checkbox"].length )
      {
         bgButtonType = kBGButtonTypeSwitch;
      }
   }
}
于 2016-10-06T16:50:07.393 回答
0

这对我来说很奇怪,NSButton 缺少它。我不明白。也就是说,扩展 NSButton 来存储最后一个设置值很容易:

import Cocoa

public class TypedButton: NSButton {
    private var _buttonType: NSButton.ButtonType = .momentaryLight
    public var buttonType: NSButton.ButtonType {
        return _buttonType
    }

    override public func setButtonType(_ type: NSButton.ButtonType) {
        super.setButtonType(type)
        _buttonType = type
    }
}
于 2019-01-09T01:00:23.970 回答