2012-04-05 8 views
7

私がtouchesBeganを受け取った瞬間、私はremoveFromSuperviewに触れていたビューとaddSuperviewを新しい親ビューにして、それから接触を続けます。しかし、私はこれがうまくいかないことがあることを発見しています。具体的には、touchesMovedtouchesEndedは決して呼び出されません。iOS:接触中にUIViewの所有権を譲渡しますか?

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

ありがとうございました。

答えて

0

切り替えたいビューではなく、スーパービューでタッチを処理する必要があります。これにより、タッチイベントを失うことなくビューを切り替えることができます。あなたがこれを行うときに、タッチが切り替わって特定のサブビューで発生しているかどうかを自分でテストする必要があります。これは、多くの方法を行うことができますが、ここではあなたが始めるためにいくつかの方法があります:別のビューにRects /ポイントを変換

:ポイントを考慮して配置されている場合ここで

[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:)]]; 

今(それはサブビューのマネージングスーパーだろう)、自己が対応させていただきます動きをパンする。

+0

その理由はわかりません。コードを投稿できますか?ところで、UIGestureRecognizerの使用を止めているのは何ですか?ほとんどの場合、私はTouchesの使用を検討しましたが、既存のUIGestureRecognizerまたはUIGestureRecognizerのサブクラス化がうまく機能することを確認しました(再利用できます)。 –

+0

在庫UIPanGestureRecognizerを使用している場合、 'touchesBegan'はあなたのコードに含まれるべきではありません。 ' - (void)viewPanned:(UIPanGestureRecognizer)pan'のようにターゲットメソッドをいくつか設定する必要があります。レコグナイザを起動すると、ターゲットを設定します: '[[UIPanGestureRecognizer alloc] initWithTarget:自己アクション:@selector(viewPanned :)]'。そのメソッドは繰り返し呼び出され、状態をチェックして適切なアクションを実行できます: 'If(pan.state == UIGestureRecognizerStateBegan){.......}'または 'If(pan.state == UIGestureRecognizerStateChanged { ....} 'など... –

+0

私はこれを反映するために私の答えを広げました –

7

の代わりに:

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

のみを使用:「ビューは一つだけスーパービューを持つことができるビューがすでにスーパーがあり、という場合には記載されているドキュメント内

[newParentView addSubview:transferView]; 

ビューは受信者ではないため、このメソッドは受信者を新しいスーパービューにする前に以前のスーパービューを削除します。

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

+1

OPの目標を達成するためにスーパービューでドラッグを管理する必要がないので、これは受け入れられる回答です** removeFromSuperView **ありがとうございます** walapu **。 – walkingbrad

+0

素晴らしい答えです、これはとても役に立ちました! – Max

関連する問題