1

次のような独自のカスタム ビューを作成する代わりに、UIView をサブクラス化する必要があるのはなぜですか。

CGRect labelRect = CGRectMake(20,20,20,20); //Frame to contain the current view
UILabel *label  = [[UILabel alloc] initWithFrame:labelRect];
label.text = @”This is a custom view with out subclassing UIView”
[self.view addSubView:label];

トレードオフや利点が見当たりませんか? 何か不足していますか?

4

3 に答える 3

2

多くの場合、テキストを並べ替えて、組み込みのボタンやラベルなどを利用しています。をサブクラス化する必要はなく、UIView代わりに を介してプログラムで実行しUIViewControllerたり、ストーリーボード/nib ファイルに追加したりできます。ただし、 a をサブクラス化する必要がある場合とその理由の良い例は、UIView使用しているビューにカスタム タッチ動作または描画を追加する場合です。

したがって、私の見方では、 a をサブクラス化する際の主な考慮事項UIViewは次のようになります。

1) タッチインタラクション、

2) カスタム図面

*単にプログラム構成の観点からビュー サブクラスを作成する理由が他にもあるかもしれないことに注意してください。ただし、動作を別の関数に委任したり、UIView. たとえば、一般的なアニメーションと背景画像の操作のサポートはすべて、サブクラス化せずに処理できますUIView

タッチ インタラクション- とのタッチ インタラクションUIViewは、いくつかの異なる方法で処理できます。タッチ イベントを直接操作するか、ジェスチャ レコグナイザを に追加できUIViewます。多くの場合、ビューで発生している個々のタッチを調べようとするのではなく、ジェスチャ レコグナイザー (またはカスタム ジェスチャ レコグナイザー) を介して必要なすべてを達成できますが、生のタッチにアクセスしたい/必要な場合次の関数をオーバーライドして、目的の動作を実装します。

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

カスタム描画- UIViewQuartz/Core Graphics を介して基本的な 2D 描画を行うことができます。1 つの例は、グラフ作成アプリケーションを実行していてUIView、スクリードのコンテキスト内で実際の線を描画したい場合です。これを実現するには、drawRect:(CGRect)rect 関数をオーバーライドして、カスタム描画をここにリストします。

そうは言っても、これが線を描く唯一の方法ではなく、カスタム描画を実行しなくてもこのタスクを完了することができます。たとえば、同じ線または線のセットを によってイメージ バッファに描画し、UIViewControllerそれに応じてビューまたはサブビューの背景として表示できます。ただし、これを行うと、UIView画面上の線の知識が失われ、その線との直接のタッチ操作がより困難になります。最後に、カスタム描画を表示するためだけにサブクラス化を回避する創造的な方法があることを覚えておいてください。ただし、プログラム設計の観点からは、単にUIViewサブクラスを作成する方が理にかなっている場合があります。

これらは決して a をサブクラス化したい唯一の理由ではありませんがUIView、 のサブクラスを作成するために使用された 2 つの最大の理由でしUIViewた。詳細については、 UIView クラス リファレンスまたはiOS 用の View プログラミング ガイドを参照することをお勧めします。

于 2012-05-17T06:04:32.133 に答える
0

私はカスタムの振る舞いとカスタムのレイアウトを言うでしょう。自動サイズ変更マスクまたはスマートローディングサブビューで使用できる範囲を超えてサイズ変更を処理することは、外部コントローラーから行うのがより困難です。

3列の表示で画像の長いリストを表示するためのスクロールビューを持つカスタム画像ビューを作成しました。画像を内部で管理するため、画面に表示されている画像のビューのみが読み込まれます。

スクロールビューをセルで手動で合成し、セルビューのキューを管理し、セルが表示されたときにのみセルをスマートにロードし、毎回すべてのタップ、スワイプ、パンジェスチャを処理してUITableViewを構築する必要があることを想像できますか?表形式の画面が必要ですか?

于 2012-05-17T05:36:39.493 に答える
0

同じ理由で、UIView は UIKit のコントロールとテキスト レイアウト ビューでサブクラス化されます。既存の実装がすべてを実行するわけではなく、カスタム実装またはメンバーが (場合によっては) 必要になるためです。

ただし、この場合、何か特定のことを行う必要がある場合、または実装を再利用する必要がある場合は、UILabel をサブクラス化することができ、サブクラス化は適切なソリューションでした。

于 2012-05-17T04:50:05.150 に答える