0

プログラムでいくつかの UIButton を生成し、ブロック アニメーションでそれらをアニメーション化しています。この回答のコードを実装することで、どのボタンが押されたかを判断できます(以下に示します)。

私の問題は、画像が重なる可能性があることです。そのため、指定されたタッチ位置に複数のビューがある場合、touchesBegan のコードが間違ったボタンを引き出します (つまり、タッチしている可視ボタンの下の画像を取得します)。

[タッチ ビュー] を使用して、画面上の UIButtons と比較したかった:

if (myButton==[touch view]) { ...

しかし、その比較は常に失敗します。

私のタッチが始まりました:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    for (UIButton *brain in activeBrains) {
        //Works, but only when buttons do not overlap
        if ([brain.layer.presentationLayer hitTest:touchLocation]) {
            [self brainExplodes:brain];
            break;
        }

        /* Comparison always fails
        if (brain == [touch view]) {
            [self brainExplodes:brain];
            break;
        }
        */
    }
}

だから私の質問は、重なり合っている画像のどれが他の画像の上にあるかをどのように判断できますか?

4

3 に答える 3

1

ここのコードでいくつかの仮定をしましたが、基本的には、タッチされたすべてのボタンのリストを取得し、「一番上にある」ボタンを見つける必要があります。一番上のボタンには、サブビューの配列内のボタンのインデックスが最も高くなければなりません。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];
    NSMutableArray *brainsTouched = [[NSMutableArray alloc] init];
    for (UIButton *brain in activeBrains) {
        //Works, but only when buttons do not overlap
        if ([brain.layer.presentationLayer hitTest:touchLocation]) {
            [brainsTouched addObject:brain];
        }
    }
    NSUInteger currentIndex;
    NSInteger viewDepth = -1;
    UIButton *brainOnTop;
    for (UIButton *brain in brainsTouched){
        currentIndex = [self.view.subviews indexOfObject:brain];
        if (viewDepth < currentIndex){ 
            brainOnTop = brain;
            viewDepth = currentIndex;
        }
    }
    [self brainExplodes:brainOnTop];
}

また、編集ウィンドウでこれを入力したので、タイプミスをお許しください。

于 2012-05-06T23:40:32.983 に答える
0

UIView クラスには、個々のビュー オブジェクトに整数値のタグを付けるために使用できる tag プロパティが含まれています。タグを使用して、ビュー階層内のビューを一意に識別し、実行時にそれらのビューの検索を実行できます。(タグベースの検索は、ビュー階層を自分で反復するよりも高速です。) tag プロパティのデフォルト値は 0 です。

タグ付きビューを検索するには、UIView の viewWithTag: メソッドを使用します。このメソッドは、レシーバーとそのサブビューの深さ優先検索を実行します。スーパービューやビュー階層の他の部分は検索しません。したがって、このメソッドを階層のルート ビューから呼び出すと、階層内のすべてのビューが検索されますが、特定のサブビューから呼び出すと、ビューのサブセットのみが検索されます。

于 2012-05-07T00:00:59.373 に答える
0

良い解決策を見つけるのを手伝ってくれてありがとう@Aaron。私は自分の状況に合わせてあなたの答えをリファクタリングして、目立たないパフォーマンスの向上(ウィー)を獲得しましたが、さらに重要なことは、将来リファクタリングする必要がある場合に読むことが少なくなると思います.

振り返ってみるとかなり明白だと思いますが、もちろん、activeBrains 配列はサブビューの順序を反映しています (それぞれの新しい脳は、スーパー ビューに追加された直後に配列に追加されるため)。したがって、配列を逆方向にループするだけで、適切な脳が爆発します。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    for(int i=activeBrains.count-1; i>=0; i--) {
        UIButton *brain = [activeBrains objectAtIndex:i];

        if ([brain.layer.presentationLayer hitTest:touchLocation]) {
            [self explodeBrain:brain];
            break;
        }
    }
}
于 2012-05-08T16:34:51.613 に答える