13

(明確にするために編集されています)

私はUITableViewを持っています。その上に、パン ジェスチャがアタッチされた UIView があります。このパンは、左右にスワイプして下にあるテーブルを変更します。パン ジェスチャのアクション メソッドを使用して、テーブルを移動します。それはうまくいきます。

ただし、UIView とそのパン ジェスチャは、UITableView の上下スクロールを妨げます。上下のスクロールをテーブルに送信し、ビューの領域で左右を維持するにはどうすればよいですか?

 ---------------------------------------
 |                                     |
 |             ----------------------  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 | UITableView |                    |  |
 |             |        UIView      |  |
 |             |          +         |  |
 |             |       PanGesture   |  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 |             ----------------------  |
 |                                     |
 |                                     |
 ---------------------------------------

パンジェスチャで発動するメソッドはこんな感じ

 -(void)move:(UIPanGestureRecognizer*)sender
 {
     CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];
     float xTest = fabsf(translatedPoint.x);
     float yTest = fabsf(translatedPoint.y);
     if ( xTest>yTest)
     {
         // Move table view left-right.. this works
     } else
     {
         // Send up-down scrolling gesture to table view????? How to?
     }
 }
4

7 に答える 7

11

水平パンではなく垂直パンの場合を除いて、同様の問題を解決しました。あなたのユースケースについて 100% 確信があるわけではないので、これはあなたが探しているものではないかもしれませんが、正しい方向に導くかもしれません。

UIPanGestureRecognizer をサブクラス化し、touchesMoved メソッドを実装して、ジェスチャの水平方向または垂直方向の変化が大きいかどうかを確認しました。以下はスニペットです。クレジットは別のスタックオーバーフローの投稿に属していますが、現時点ではリンクが見つかりません。(初投稿で下手くそですみません)

-(void)touchesMoved:(NSSet*) touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if(self.state == UIGestureRecognizerStateFailed) return;
CGPoint currentPoint = [[touches anyObject] locationInView:self.view];
CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view];
moveX += prevPoint.x - currentPoint.x;
moveY += prevPoint.y - currentPoint.y;
if(!drag) {
    if(abs(moveY) > abs(moveX))
        drag = YES;
    else
        self.state = UIGestureRecognizerStateFailed;
}
}

-(void)reset
{
[super reset];
drag = NO;
moveX = 0;
moveY = 0;
}

この場合は UITableView になると思われる親ビュー コントローラーで、次の実装も行いました。あなたの場合、水平パンの場合は no を返したいと思います。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if([gestureRecognizer isKindOfClass:[VerticalPanGestureRecognizer class]])
{
    return YES;
}
return NO;
}

不明な点があればお知らせください。

幸運を!

于 2012-10-18T20:45:20.387 に答える
3

UIGestureRecognizer認識されたジェスチャーがイベントをビュー階層に転送するのを防ぐプロパティがあります-それがあなたにとって正しいオプションであるかのように聞こえます。それを試してNO、問題のジェスチャー認識に向けて設定してください。

cancelsTouchesInView

ジェスチャが認識されたときにタッチがビューに配信されるかどうかに影響するブール値。

@property(nonatomic) BOOL cancelsTouchesInView

討論

このプロパティが YES (デフォルト) で、レシーバーがジェスチャを認識した場合、保留中のそのジェスチャのタッチはビューに配信されず、以前に配信されたタッチは、ビューに送信された touchesCancelled:withEvent: メッセージによってキャンセルされます。ジェスチャ レコグナイザーがジェスチャを認識しない場合、またはこのプロパティの値が NO の場合、ビューはマルチタッチ シーケンスのすべてのタッチを受け取ります。

iOS 3.2 以降で利用できます。

UIGestureRecognizer リファレンスから。

于 2012-10-18T18:03:07.510 に答える
2

OK、答えは、UIView ではなく UITableView にパンを追加することでした。次のように、ジェスチャの位置が (xib で非表示になっている) UIView の境界内にあるかどうかを確認します。

 - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
 {
     CGPoint translation = [gestureRecognizer locationInView:self.view];
     CGRect frame = self.slideTarget.frame;
     if (CGRectContainsPoint(frame, translation))
     {
         return YES;
     } else
     {
         return NO;
     }
 }

ブーム。

于 2012-10-19T12:02:53.720 に答える
1

パンジェスチャの方法でこれを書きます:

- (void)pan:(UIPanGestureRecognizer *)gesture
{
    CGPoint translatedPoint = [gesture translationInView:self.tableView];

    if (ABS(translatedPoint.y) > 10.0f) {
        self.tableView.bounds = CGRectMake(0, -translatedPoint.y, 320, 460);
    }
    if (ABS(translatedPoint.x) > 10.0f) {
        // swipe left/right code...
    }
}

ここでは、境界プロパティを変更することにより、テーブルビューのスクロールを模倣します。ただし、このコードはテーブルビューをバウンスしません。この効果は、パンジェスチャの開始時にバウンスプロパティの状態を保存し、ジェスチャの終了時にこのプロパティを割り当てることで実現できます。

于 2012-10-18T21:00:53.333 に答える
1

UIView 内のジェスチャをその方向 (垂直 -> スクロール テーブル、水平 ​​-> スクロール UIView) に応じて処理する必要があることを理解しています。私は読んだ - 試していない - これについて: UISwipeGestureRecognizer には属性の方向があります - ドキュメントから:

The permitted direction of the swipe for this gesture recognizer.

多分それはあなたを助けることができますか?

編集:ああ、まあ、私はあなたが UIPanRecognizer を見ていることを認識していませんでした (「スワイプ」が多すぎます)...報告されているように、パンの方向が「十分に垂直」である場合、ジェスチャーをテーブルに渡すことができるかもしれませんによってtranslationInView:..?

于 2012-10-18T19:54:17.587 に答える
0

UIGestureReconizerDelegateという名前のメソッドを実装し - gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:ます。

falseデフォルトで戻り、実装して戻りますtrue.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return true;
}

delegateまた、ジェスチャのプロパティを設定することを忘れないでください。

// Set the delegate of the panGesture. For example
self.panGestureReconizer.delegate = ... //

アップルのドキュメントから

(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

2 つのジェスチャ レコグナイザがジェスチャを同時に認識できるようにするかどうかをデリゲートに尋ねます。

戻り値

YES は、gestureRecognizer と otherGestureRecognizer の両方が同時にジェスチャを認識できるようにします。デフォルトの実装は NO を返します。2 つのジェスチャを同時に認識できません。

討論

このメソッドは、gestureRecognizer または otherGestureRecognizer によるジェスチャの認識が、他のジェスチャ レコグナイザーによるジェスチャの認識をブロックする場合に呼び出されます。YES を返すと、同時認識が保証されることに注意してください。一方、NO を返すと、他のジェスチャ レコグナイザのデリゲートが YES を返す可能性があるため、同時認識を防止できる保証はありません。


続きを読む

于 2016-06-23T09:38:15.400 に答える