0

iOS アプリケーションのアクセシビリティ プロジェクトに取り組んでいます。アクセシビリティは宣伝どおりには機能しないため、VoiceOver によって認識される領域 (描画とタッチ認識の両方) をコントロール ビューの「自然な」境界を超えて拡張するために、サブクラスでaccessibilityFrameaccessibilityActivationPointをオーバーライドする必要があります。pointInside:withEventしたがって、の VoiceOver 境界を変更するには、UIButtonそのクラスをサブクラス化し、これら 3 つのメソッドを追加する必要があります。これを行うUILabelには、コードを含む別のサブクラスを追加する必要があります。

これらのメソッドのコードを中央の場所にリファクタリングすることはできますが、継承を使用してこれをよりエレガントに行うことができるかどうか疑問に思っていました。UIViewこのコードを(maybe called UIViewAccessible) のサブクラスに入れてから、の代わりにから継承される、 から継承さUIButtonれる と呼ばれるのサブクラスを作成したいと思います。これは可能ですか、またはこのようなことをカテゴリで行うことができますか?UIButtonAccessibleUIButtonUIViewAccessibleUIView

編集:ドキュメントによると、カテゴリでこれを実際に達成することはできません:

カテゴリで宣言されたメソッドの名前が、元のクラスのメソッド、または同じクラス (またはスーパークラス) の別のカテゴリのメソッドと同じである場合、どのメソッド実装が使用されているかについての動作は未定義です。ランタイム。

これを行う他の方法はありますか?

4

1 に答える 1

2

あなたの質問に答えるために、いいえ、できません。あなたは継承チェーンUIViewAccessibleの2番目の兄弟であるためです(どちらもある時点から継承します)。しかし、あなたはすでにそれを知っていたと思います。解決策としては、アクセス可能なクラスをデコレータでラップし、強い型付けのためのプロトコルを使用することができます。そうすれば、コードを1か所にまとめることができます。ここでは、この手法について詳しく説明しました(ただし、目的は異なりますが、同じ状況です)。UIButtonUIViewUIView

アクセシビリティをサポートするビューの場合は、次のようにする必要があります。

@property (nonatomic, strong) UIView<MyAccesibilityProtocol>* view;

//self.view can come from the nib or previously created in code
self.view = [[AccesibilityDecorator alloc] initWithDecoratedObject:self.view];

//you can then use self.view like any other UIView, 
//and because it also implements an 
//accessibility protocol, you can use the methods 
//implemented in the wrapper as well.
//more than that, you can control which methods to override
//in the AccesibilityDecorator class
[self.view addSubview:otherView];//could be overridden or not
[self.view myAccesibilityMethod];//custom method declared in the protocol
于 2013-03-01T05:44:00.020 に答える