4

2 つのサブクラスの物語

ベン・ストック

プロローグ

私は、使用されているウィンドウの種類に応じて外観を自動的に変更する、非常に見栄えの良いコントロールのセットを作成中です (たとえば、通常のウィンドウにボタンをドロップすると、他の標準的な Aqua のように見えます)。ボタン.ただし、NSPanelウィンドウ マスクが の の上にドロップすると、NSHUDWindowMaskそのスタイルが HUD バックグラウンドで見栄えがするように自動的に切り替わります. これまでのところ、 , , および をサブクラスNSButtonNSTextFieldNSSliderましたNSSearchField.NSTabViewカスタマイズ性の欠如に打ちのめされる. それは本当にお尻の痛みですが, 私は開発者なので、自分のやり方を見つけることに慣れていますNSSegmentedControl.によって使用されるプライベート タブのNSTabView. ここまでは順調ですね。ボタンは選択可能で、新しいNSTabViewItemが追加されると自動的に更新され、本物と同じように機能します。

そして痛みが始まる…</h2>

最後に、私は自分のセグメントのスタイルを設定し始めます.WTF 私は自分自身を手に入れました. Objective-C の開発は、私の人生をゆっくりと何年も短縮しています。何をしてもNSSegmentedCell、セグメント幅が変更されたときに で使用される「トラッキング エリア」が更新されていないようです。幅が変わると、アートワークも変わります。ただし、実際のトラッキング エリアは更新されません ( をオーバーライドしても-updateTrackingAreas。説明するのは非常に難しいので、 in で描画されたものの前後にセグメントの四角形描画することにしました。これが私のアートが上に描かれたスクリーンショットです)。基礎となるトラッキング エリアの:super-drawSegment:inFrame:withView

デバッグ用の長方形を表示する Mac OS X の HUD パネル。

そしてsuper、これが私のセグメント四角形の上の の実装です:

ここに画像の説明を入力

考えられるすべてをオーバーライドしようとしました。以下に、私がオーバーライドした (およびオーバーライドしなかった) メソッドのいくつかを示します。

  • -cellSize( NSSegmentedCell)
  • -cellSizeForBounds:( NSSegmentedCell)
  • -sizeToFit( NSSegmentedControl)
  • -intrinsicContentSize( NSSegmentedControl)
  • -setWidth:forSegment:( NSSegmentedControl/ Cell)
  • -startTrackingAt:inView:( NSSegmentedCell)
  • -continueTracking:at:inView:( NSSegmentedCell)
  • -stopTracking:at:inView:mouseIsUp:( NSSegmentedCell)

この時点で、上記のリストのメソッドのいくつかはまだ私のオーバーライドを使用しており、いくつかは使用していません。組み合わせて、削除して、単純化し、書き直して、リファクタリングしましたが、何をしても、下にある四角形は変わりません。私は次の男と同じくらい Apple を愛していますが、カスタマイズに対する彼らの見方は変える必要があります。これらすべてのばかげたコントロールの実装で何が起こっているのか理解できないのは我慢できません。言うまでもなく、 Auto Layout についてはまだ完全には理解できていません (これは、私が今まで扱った中で最も「自動」ではないことです) が、それはまた別の機会に投稿します。とにかく、誰か兄弟を助けることができれば、私はとても感謝しています. 暴言を吐いてすみません、読んでくれてありがとう!

PS これらはいずれも完成していないため、いくつかのピクセルの欠陥についてはあまり気にしないでください。;-)

4

0 に答える 0