9

NSButtonCell をサブクラス化して、描画 (カスタマイズ可能なテーマ) をカスタマイズしています。チェックボックスとラジオボタンの描画方法をカスタマイズしたいと思います。

ボタンがチェックボックスかラジオボタンかを検出する方法を知っている人はいますか?

-setButtonType: のみがあり、ゲッターはありません。また、-showsStateBy も -highlightsBy も、画像と代替画像を含む通常のプッシュ ボタンには適用されないチェックボックスの一意の戻り値を提供していないようです。

これまでのところ、私は 2 つの (あまりきれいではない) 回避策を見つけましたが、それらはおそらくアプリが MAS から拒否されるようなものです:

  1. [self valueForKey: @"buttonType"] を使用します。これは機能しますが、メソッドがヘッダーに含まれていないため、これは Apple が私に望んでいないことだと思います。

  2. -setButtonType: および -initWithCoder: をオーバーライドして、手動または XIB から設定されたボタン タイプを追跡します。ボタンの種類をディスクに保存するために使用されるキーが文書化されていないため、ここで問題になるのは XIB の場合です。繰り返しますが、プライベート API を使用します。

クライアント コードで、チェックボックス用に別の ULIThemeSwitchButtonCell クラスを使用し、ラジオ ボタン用に 3 つ目のクラスを使用するよう強制するのではなく、これを NSButtonCell の単純なドロップイン代替品にしたいと考えています。

4

3 に答える 3

2

ボタンは、そのスタイルについて何も知りません。

NSButton のドキュメントから

-buttonType メソッドがないことに注意してください。set メソッドは、一緒にタイプの動作を確立するさまざまなボタン プロパティを設定します。-

ボタンをチェックボックスまたはラジオボタンとしてマークするには、tag: および setTag: (NSControl から NSButton によって継承) を使用できます。プログラムでそれを行う場合は、使用する定数を定義する必要があります。タグは Interface Builder でも設定できますが、整数値 (マジック ナンバー) としてのみ設定できます。

于 2013-08-16T16:26:07.940 に答える
0

initWithCoder では、Mac OS Sierra 用に更新された BGHUDButtonCell.m ソリューションの私の適応は次のとおりです。

-(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 に答える