2

いくつかのオブジェクトを(を使用して)NSCellビューに直接描画し、 NSViewのセレクターを使用してインスタンスを描画するサブクラスを作成しています。drawInRect:fromRect:operation:fraction:respectFlipped:hints:NSButtonaddSubview:

最初の方法を使用して描画されたオブジェクトはすべて正しく描画されますが、NSButton正しく描画するのに問題があります。問題は、私のNSButtonインスタンスが適切な場所に描画されますが、何度も描画されることです。

私はこれをインターネットでしばらく調べており、キャッシュの使用を提案する人もいますが、これが効率的かどうかはわかりません。(forループを使用してボタンを含む配列に移動すると、大量のデータを表示するため、間違いなくスクロールが遅くなります...)

これをどのように行いますか?私は間違った木を吠えていますか?

これは関連するコードです:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}
4

2 に答える 2

5

短編小説:お絵かきをしている間、友達は友達にさせないでください。addSubview

これは、制御インターフェースを管理するための基本的な、そして特によく説明されていない側面ですが、理解することが重要です。

コントローラーにサブビューの「順序」を指示させてください。そうすれば、そのボタンがあからさまにぐちゃぐちゃになってはいけないことを知って、ぐっすり眠ることができます(カスタム描画ルーチン内でボタンが乱雑になっている場合はそうではありません)。

この路地に閉じ込められるのは簡単です。たとえば、私は自分にを追加しましたが、すべてが大丈夫なようNSImageViewinitWithFrameです…しかし、それはあなたがそれを行うことになっている方法ではないようです、私は推測します…そしてあなたがサブクラス化を始めるときNSControlなどは、その理由に気づき始めたときです。

更新: これは、同様に優れたサンプルプロジェクトが添付されたカスタムコントロールの設計に関する非常に優れた記事です。これは、このタイプの問題を回避するのに役立つ種類のコード編成を具体化したものです。たとえば、コントローラークラスでは、各ボタンを個別に、一意に、他のビューのビジネスから独立させていることに気付くでしょう…</ p>

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

ここに画像の説明を入力してください

于 2012-08-01T02:54:56.303 に答える
2

NSButtonセル自体を描画するたびにインスタンスをビュー階層に追加して「描画」することは、間違いなく悪い考えです。代わりに、NSButtonCellを作成し、好みに合わせて構成してください。次に、-[NSCell drawInteriorWithFrame:inView:]セルivarを使用してその外観を描画します。

NSButtonテーブルビューの各セルにクリック可能なインスタンスを配置する場合は、可能な場合はへの呼び出しを避けてくださいaddSubview:。これを行うたびに、コントロールビューはそのレイアウトを無効にし、すべてを最初から再描画して、場合によってはある種の再帰を作成する可能性があります。

于 2012-07-27T15:50:07.190 に答える