13

最近では、カスタム コントロール用にあらゆる種類の凝った描画を行う OS X アプリがますます増えているようです。ほんの数例を挙げると、Twitterific、Things、EventBox、Versions などのアプリ....

基本的に、この種のことを始める方法についての情報を探しています。コントロールをサブクラス化し、カスタム描画を使用するだけで行われるのか、それともまったく異なるものなのかはわかりません。

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

25

それはあなたが何をしたいかによって完全に異なります。

たとえば、Versions の [Show Raw Properties] ボタンは NSButton サブクラスです。これは、基本的に、独自の外観を持つ標準的なボタンの動作が必要だからです。ボタンをサブクラス化する 1 つの方法は、独自の -drawRect:(NSRect)rect メソッドを NSButton サブクラスに単純に実装することですが、NSButton が Cocoa で実装される方法に固執することにしました。つまり、ほとんどの描画はボタンのセルによって行われます。実装は次のようになります。

NSButton サブクラスでは:

+ (Class) cellClass
{
    return [OurButtonCell class];
}

- (void)drawRect:(NSRect)rect 
{
    // first get the cell to draw inside our bounds
    // then draw a focus ring if that's appropriate
}

NSButtonCell サブクラス (OurButtonCell) では:

- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView
{
    // a bunch of drawing code
}

バージョンのタイムライン ビューは、実際には WebView です。そこに表示されるページは、JavaScript を使用して、クリックしたヘッダーを折りたたみます。

カスタム コントロールをどこから開始するかについて、私が使用する経験則は次のとおりです。

  • 標準の Cocoa コントロールの外観をカスタマイズするには:
    • 適切なコントロールをサブクラス化します (NSButton や NSButtonCell など)。
    • デフォルト コントロールが実装されている方法にできるだけ近づけます (たとえば、ボタン セルでは、既存の attributedTitle インスタンス メソッドから開始してボタン タイトルを描画します。ただし、IB での設定に関係なく、常に同じ属性で描画したい場合を除きます)。または、バージョンのメイン ウィンドウの試用期限ボタンなど、状態に基づいて異なる属性で描画する必要がある場合)
  • まったく新しい UI 要素の作成:
    • NSView をサブクラス化し、ほとんどすべてのマウスおよびキー イベント処理 (ビュー内では、"hitTest:" をやり直す必要はありません) と描画コードを自分で実装します。
  • 複雑で任意の高さのテーブルではないものを提示するには:
    • HTML、CSS、および JS で実行できるかどうかを確認し、WebView で表示します。Web はテキストのレイアウトに優れているため、その責任を WebView に任せることができれば、首の痛みを大幅に軽減できます。

独自のカスタム ビューの描画メソッドで描画する方法を学習するための推奨読書: Cocoa Drawing Guide

たとえば、NSTableView の外観をカスタマイズすることは、テーブルビューの複雑さのおかげで、まったく別のお茶であり、あらゆる場所で発生する可能性があります。テーブルでやりたいことのために独自のカスタムセルを実装しますが、実際の NSTableView オブジェクト自体のサブクラスで行が強調表示される方法を変更する必要があります。たとえば、 Matt Gemmell のサイトにあるiTableView のソース コードを参照して、どこに何を描画するかの明確な例を確認してください。

最後に、BWToolkit のコードをチェックアウトするという Abizer の提案は素晴らしいアイデアだと思います。最初は少し圧倒されるかもしれませんが、そのコードを読んで理解できれば、独自のカスタム ビューとコントロールを問題なく実装できるでしょう。

于 2008-12-19T13:46:25.537 に答える
3

いくつかの優れたコード例を見てください: BWToolkit

于 2008-12-19T12:52:50.433 に答える