4

過去 4 時間、多くの Stack Overlow ソリューションを試しましたが、問題の解決に役立つものはありませんでした。

ここにあります、

  • UIScrollViewがあります
  • その ScrollView 内には、1 つのカスタム UILabel と 8 つのカスタム UIImageViewsがあります。
  • 長押しを検知したい
  • このようなものが機能します

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
    longPress.minimumPressDuration = 0.5; [scroll addGestureRecognizer:longPress]; //scroll defined elsewhere

ただし、スクロールをスクロールのサブビューに置き換えると、長押しイベントは発生しません。

  1. スクロール ビューのサブビューの長押しを検出するにはどうすればよいですか?
  2. これは非常に厄介なハックですが、スクロールビューの長押しを検出できるため、プレスの位置を検出して、どの特定のサブビューが押されているかを確認できる方法はありますか?

また、(insert subview here).userInteractionEnabled = YESスクロール ビューのすべてのサブビューにこのプロパティを設定したので、これは問題になりません。

また、スタック オーバーフローの他の場所で提案されているように、touchesBegan および touchesEnded メソッドを使用してみました。

また、イメージ ビューについては、for ループを使用して、カスタム イメージ ビューごとに新しい UILongPressGestureRecognizer を設定します

初めての iOS 開発者から、

グラハム

PS 面倒な 2. よりも 1. の解決策を見つけることができれば、本当に好きです


要求に応じたその他のコード:

ビューコントローラーの初期化で

 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
longPress.minimumPressDuration = 0.5;
[self.titleLabel addGestureRecognizer:longPress]; //titleLabel property initialized elsewhere
[mainView addSubview:self.titleLabel];

「画像の読み込み」メソッドで

for (NSData * dataImg in results) {
//Does some work turning data into an image, into an image view called img
        img.delegate = self;
        img.userInteractionEnabled = YES;
        UILongPressGestureRecognizer *aLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
        aLongPress.minimumPressDuration = 0.5;
        [img addGestureRecognizer:aLongPress];
        [imgContainer addSubview:img];
}

さらに多くのコード + ノート

self.view (UIView)

->スクロール (UIScrollView)

->->mainView (UIView)

->->->titleLabel (UILabel)

->->->imgContainer (UIView)

->->->->画像 (UIImageViews)

[self.view addSubview:scroll];
[scroll addSubview:mainView];
[mainView addSubview:self.titleLabel];
[mainView addSubview:imgContainer];
[imgContainer addSubview:img]; //done 8x via for loop

@RegularExpression の回答のおかげで、mainView は押されているが、そのサブビューは押されていないことに気付いたので、その上に mainView のサブビューを表示する方法を見つける必要があります。:)

別の更新、titleLabel が動作します。ただし、ImageViews はまだ機能しません。:(

4

5 に答える 5

12

これは少し遅れており、回答が選択されていることはわかっていますが、iOS7を使用している場合に他の誰かが簡単な解決策を望んでいる場合に備えて.

UILongPressGestureRecognizerのデリゲート内で、 gestureRecognizer:shouldRequireFailureOfGestureRecognizer:otherGestureRecognizerセレクターを実装します。

otherGestureRecognizerが UIPanGestureRecognizer であるどうかを確認して YES を返し、そうでない場合は NO を返します

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }

    return NO;
}

スクロール ビューは、実際にはプライベート API の一部である UIScrollViewPanGestureRecognizer を生成しますが、これは UIPanGestureRecognizer のサブクラスであるため、上記は正常に機能します。

iOS6 以下をサポートするには、UIScrollView のgestureRecognizers をループし、どれが UIPanGestureRecognizer であるかを検出し、UILongPressGestureRecogizerrequireGestureRecognizerToFailセレクターを実行する必要があります。

于 2013-09-27T13:09:23.567 に答える
2

あなたのコードは問題ないようです。うまくいくはずです。私は以下のコードを使用し、私にとってはうまく機能しています。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.delegate = (id)self;
longPress.minimumPressDuration=0.05;
imageView.userInteractionEnabled = YES;
[imageView addGestureRecognizer:longPress];

とその方法、

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender {
   NSLog(@"detected");

if (sender.state == UIGestureRecognizerStateEnded){
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"YES"    delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
     [alert show];
   } 
}

ここで、uが言ったように、imageViewをスクロールビューのサブビューとして取りました

于 2013-04-08T05:02:05.360 に答える
1

UIScrollView は共通の親であるため、おそらくジェスチャ認識エンジンが必要な場所です。アクションで指定されたポイントの位置を見ることで、どのサブビューが押されているかを判断できます。したがって、個々のサブビューにはジェスチャ レコグナイザーは必要ありません。

したがって、次のようにします。

- (void)longPressDidFire:(UILongPressGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
        CGPoint point = [sender locationInView:scroll];
        UIView *tappedView = [scroll hitTest:point withEvent:nil];

そのため、長押しされたビューがあります。

アクションが起動しない原因となるその他の原因としては、デリゲートの問題、またはタッチをインターセプトしている別のビューにスクロールが含まれている場合があります。

HTH

于 2013-04-08T04:09:46.427 に答える
0

うまくいきます!

問題は次のとおりです。

imgContainer は、サブビューとしていくつかの UIImageViews を持つ空のフレームを持つ UIViewでした

サブビューを imgContainer に追加すると、imgContainer が展開されるという印象を受けました。

これは正しくありません

imgContainer のフレームをスクロール ビューと同じコンテンツ フレームに設定する必要がありましたが、すべて問題ありませんでした。

この回答が、私のような他の将来のiOS初タイマーに役立つことを願っています.

于 2013-04-08T07:09:02.253 に答える