1

最近ペイントコードを購入しました。これを使ってスライダーを作りました。Xcode で、ストーリーボードで空のビューを作成し、それをSlider.mスライダー コードがあるクラスに設定して、このアプリを実行すると、次のようになります。

ここに画像の説明を入力

私の描画コードは内部にあります -

(void)drawRect:(CGRect)rect {}

Slider.hは fram を継承していますUISlider。say から継承するとUIButton、自分の絵だけが表示されます。

何故ですか?

4

1 に答える 1

2

表示された結果は、UISlider(他の多くのコントロールの中でも) 実際には、描画自体を処理する複数のサブクラスで構成されているという事実に基づいています。drawRect:結果は高度に最適化された表示コードであり、のみを使用して適切にオーバーライドすることはできませんUISlider。その構成されたコントロールの他のいくつかの部分的に閉じられた実装をオーバーライドする必要があります。

実際、カスタマイズしたいグラフィック要素を提供する、はるかに簡単でパフォーマンスの高いソリューションがありますUISliderこの主題に関する優れた紹介は、Apple のSlidersの概念紹介にあります。

ただし、いくつかの小さな落とし穴があります。その 1 つは、UISlider親指が別のサイズのものに置き換えられることを「好まない」という事実です。ただし、これらは多くのチュートリアルでカバーされています。そのうちの 1 つはhow-to-make-a-custom-uisliderです。

経験則としてdrawRect:、UI のパフォーマンスが大幅に低下するため、サブクラス化とオーバーライドは可能な限り避けてください。

UIAppearance代わりに、カスタマイズ用のインターフェイスを提供しないコントロールのプロトコルを利用するソリューションを検討してください。UISliderただし、それらを提供するので、それらを使用してください。

これは私のアプローチの優先リストです。

  1. 問題のコントロールが画像などを提供してカスタマイズできるかどうかを慎重に確認してください。
  2. 問題のコントロールがUIAppearanceプロトコルに準拠しているかどうかを確認します。
  3. サブクラス化とオーバーライドの使用drawRect:
  4. 問題のコントロールがdrawRect:「奇妙な」方法で処理されているように見える場合UIViewは、欠落しているロジックを自分でサブクラス化して再作成します。
于 2013-12-25T23:13:16.720 に答える