2012-04-27 6 views
0

ウィンドウ内のCGPointに基づいて、アクセシビリティエレメントがヒットした場合、それは何か(もしあれば)ヒットします。これは可能ですか?アクセシビリティ要素のヒットテストのソート...アクセシビリティ要素ヒットを返します(作成されたシステムを含む)。これを行う方法があるように見えます。ポイントのアクセシビリティエレメント

答えて

0

私は順番にあなたは、あなたが欲しいものを達成することを恐れます基本的にどのように再実装する必要がありますか?ブラウザはDOMで扱う彼らのイベントでキャプチャ段階の操作を行います。

  • スタート最も一般的な要素で - どんなのUIKitベースのアプリケーションで、これは、アプリケーションのkeyWindowか(アプリケーションがマルチスクリーンの場合)前になりますほとんどのあなたが問題のオブジェクトは、アクセシビリティ・コンテナであるかどうかwindowLevelなど
  • チェックを通じて把握する必要があります、画面のウィンドウ、および
    • そうであれば、適切なものを求め、それに再帰します。
    • アクセシビリティ要素でない場合は、アクセシビリティ要素であることを確認してください。ベールでない場合は
      • です。
      • ある場合は、アクセシビリティフレームに問題のポイントが含まれているかどうかを確認します。
      • の場合はとなります。おめでとうございます。問題の要素を見つけることに成功したので、返却する必要があります。
      • そうでない場合は、退会します。今では

、我々は、コンテナ内の例アクセシビリティ要素と要素を扱っています。

アクセシビリティ・コンテナは、アクセシビリティ・コンテナであり、アクセシビリティ・コンテナでもあります。アクセシビリティ・エレメントは、それ自体アクセシビリティ・エレメントです。
問題のポイントの要素を生成しないコンテナがあります。

アクセシビリティ要素の場合は、そのフレームにポイントが含まれているかどうかを確認し、 - もしそうなら、self、 を返します。

私はいつもリターン・ゼロを意味しています。

ロジックをすべて取得してコードに変換し、NSObjectのカテゴリに入れます。

+0

これは私が探していたようですが、テストする機会はありませんでした。 – BadPirate

0

私の最善の答えは次のようになります。 すべてのアクセシビリティ要素を配列に追加します。 touchesEndedメソッドでは、配列を列挙し、いずれかの要素に触れているかどうかを確認します。これを行う1つの方法は、要素のboundingBoxにCGPointが含まれているかどうかを確認することです。 その後、そのタッチに対応するコードを書くことができます! これが役に立ったと思います!^_^

+0

悲しいことに私の質問に答えることができません...私が決定しようとしているアクセシビリティ要素は、iOSによって作成されたUIです。例えば、キーボードのUIです。 – BadPirate

+0

実際の質問に最も接近しています。 – BadPirate

0

これを行うには2つの方法があります。 第1は、あなたがUIView(新しいファイル、カテゴリー、名前、それは「タップ」、「のUIView」のサブクラス)のカテゴリを作成し、その中にこのコードを置く:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    NSLog(@"%@", self); 
} 

をこれまでのところ、このコードは動作しますすべてUIViewですが、それ自身のすべてのサブクラスではありません。したがって、さらにいくつかのサブクラス(例えば、UIControlUIWindowなど)を作成する必要があります。これらのサブクラスでは、あなただけの呼び出し、NSLog()何もする必要はありません。これらすべてのサブクラスがスーパークラスを呼び出すため

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
} 

は、彼らが NSLog() UIViewのを呼び出すことになります。欠点は、すべてのケースで非常に多くのサブクラスを作成する必要があることです。たとえば、 UIControlの場合は UIView、次に UIButtonの場合は UIControlなどが必要です。

他の方法では、はあなたの求めるものではありませんが、はるかに簡単です。サブビューを再帰的に呼び出すだけです。

- (void)logView:(UIView*)v index:(int)i 
{ 
    NSMutableString *str = [NSMutableString string]; 
    for (int u = 0; u<i; u++) { [str appendString:@"| "]; } 
    [str appendFormat:@"<%@ %p frame:%@>", v.class, v, NSStringFromCGRect(v.frame)]; 
    // of course you can change it to display your accessibility hint/label 
    printf("%s\n", [str UTF8String]); 

    for (UIView *vv in v.subviews) { [self logView:vv index:i+1]; } 
} 

あなたは一度、このメソッドを呼び出す:

[self logView:self.view index:0]; 

...、それは自動的に出力としてツリーを作成します。

<UITextField 0x6b30010 frame:{{20, 13}, {280, 31}}> 
| <UITextFieldRoundedRectBackgroundView 0x6b31e00 frame:{{0, 0}, {280, 31}}> 
| | <UIImageView 0x6b31fe0 frame:{{0, 0}, {0, 0}}> 
| | <UIImageView 0x6b32070 frame:{{0, 0}, {0, 0}}> 
| | <UIImageView 0x6b320e0 frame:{{0, 0}, {0, 0}}> 
+0

あなたは質問を見逃してしまったと思います:)ヒットビューを見つけようとしていませんが、ヒットしたUIAccessibilityElementを見つけようとしています...いつもビューではありません(ビューが存在しないときにUIAccessibilityElement領域を定義する方法があります、それはかなり頻繁に使用されます)。また、hitTestはヒットしたビューを返すメソッドです(非対話型の要素は返されませんが)。 – BadPirate

+0

ああ、今、私はそれを得た。いくつかのことを試しましたが、成功を収めていませんでした:/実際に私はアクセシビリティを得られませんでした.-私は隠された場所でそれを有効にしなければなりませんか?私は、UI要素のラベルとヒントを設定して、コード 'NSLog(@"%@ "、[itm accessibilityHint])で尋ねました;' result: '(null)'? 'accessibilityElementCount'は不自然で、' self.accessibilityElementAtIndex: 'は常に'(null) 'です。アクセシビリティインスペクタが正しいことを示します。 'UIAccessibilityElement'のカテゴリは* phu * –

+0

で動作しません。独自の要素を作成することができます。設定でアクセシビリティを有効にすると、要素を実際に見ることができます。ユーザーが関連するアクセシビリティ要素が何であるかを領域に触れたときに、それまでのところ情報を共有していないように見えます:( – BadPirate

0

現在、最新のAPIでこれを行う方法はないようです。

関連する問題