7

を受け取った瞬間にtouchesBeganremoveFromSuperviewタッチされたビューとaddSuperview新しい親ビューに移動し、引き続きタッチを受け取ります。ただし、これが機能しない場合があることがわかりました。具体的には、touchesMovedandtouchesEndedが呼び出されることはありません。

これを正しく機能させるためのトリックはありますか? これは、ビューが最初にスクロール ビュー内にあるドラッグ アンド ドロップ動作を実装するためのものです。

ありがとう。

4

2 に答える 2

7

それ以外の:

[transferView removeFromSuperView];
[newParentView addSubview:transferView];

使用のみ:

[newParentView addSubview:transferView];

ドキュメントには、「ビューは1つのスーパービューしか持てません。ビューにすでにスーパービューがあり、そのビューがレシーバーではない場合、このメソッドは、レシーバーを新しいスーパービューにする前に、以前のスーパービューを削除します。」と述べています。

したがって、removeFromSuperViewはaddSubviewによって処理されるため、使用する必要はありません。removeFromSuperViewは、touchesEndedを呼び出さずに現在のタッチを終了することに気づきました。addSubviewのみを使用する場合、タッチは中断されません。

于 2013-02-25T04:37:24.960 に答える
0

切り替えたいビューではなく、スーパービューでタッチを処理する必要があります。これにより、タッチイベントを失うことなくビューを切り替えることができます。ただし、これを行うときは、切り替えたい特定のサブビューでタッチが発生しているかどうかを自分でテストする必要があります。これはさまざまな方法で実行できますが、開始するためのいくつかの方法を次に示します。

Rects / Pointを別のビューに変換する:

[view convertRect:rect toView:subview];
[view convertPoint:point toView:subview];

ポイントがビューにあるかどうかをテストするいくつかの方法を次に示します。

[subView hitTest:point withEvent:nil];
CGRectContainsPoint(subview.frame, point); //No point conversion needed
[subView pointInside:point withEvent:nil];

一般に、UIGestureRecognizersを使用することをお勧めします。たとえば、UIPanGestureRecognizerを使用している場合は、ジェスチャレコグナイザーが呼び出すことができるメソッドを作成し、そのメソッドで作業を行います。例えば:

- (void) viewPanned:(UIPanGestureRecognizer *)pan{
    if (pan.state == UIGestureRecognizerStateBegan){
        CGRect rect = subView.frame;
        newView = [[UIView alloc] initWithFrame:rect];
        [subView removeFromSuperview];
        [self addSubview:newView];
    } else if (pan.state == UIGestureRecognizerStateChanged){
        CGPoint point = [pan locationInView:self];
        newView.center = point;
    } else {
        //Do cleanup or final view placement
    }
}

次に、レコグナイザーを初期化し、それをターゲット(通常は自己)に割り当てて追加します。

[self addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewPanned:)]];

これで、自己(サブビューを管理するスーパービュー)がパンの動きに応答します。

于 2012-04-05T15:24:19.870 に答える