2

スクロールビューを含むメインの UIView があります。このコードを使用して、4 種類のスワイプのメイン ビューに UIGestureRecognizer をセットアップしました。

UISwipeGestureRecognizer *swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(upCommand)];
[swipeUpRecognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[mainGameView addGestureRecognizer:swipeUpRecognizer];
... // Done 4 times for each direction

スクロールビューでスクロールを無効にすると、このコードはうまく機能します (画面のどこでもスワイプでき、関連するアクションが期待どおりに実行されます)。ただし、スクロールビューで 2 本の指をタッチすると、スクロールビューが通常機能するように前後にパンできるように機能を追加したいと考えています。スクロールビューにジェスチャ認識機能を追加して、2 本の指がパンしたことを検出しようとしました。

- (void)viewDidLoad
{
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan)];
    panGestureRecognizer.minimumNumberOfTouches = 2;
    panGestureRecognizer.maximumNumberOfTouches = 2;
    [scrollView addGestureRecognizer:panGestureRecognizer];
}

- (void)recognizePan
{
    [gameScrollView setScrollEnabled:YES];
}

これを次の方法と組み合わせて使用​​し、指が離されたらスクロールを再び無効にしました。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [gameScrollView setScrollEnabled:NO];
}

この種はうまくいきましたが、私が望む方法ではありません。スクロールビューで 2 本の指をドラッグすると、スクロールが有効に設定されますが、その 2 本の指を使用してスクロールすることはできません。最初に 2 本の指を離す必要があり、それから 1 本の指でスクロールできるようになります (2 本の指は機能しません)。そして、スクロールビューをスクロールできる 1 本の指を離すと、 で設定されているように、スクロールが無効になりscrollViewDidEndDraggingます。

明らかに、このタイプのスクロールはあまりユーザーフレンドリーではありませんが、スクロールビューを設定する方法が見つからないように見えるので、スクロールビューを2本の指でドラッグしているときにのみスクロールします。事前に助けてくれてありがとう。

~ 17 歳のアマチュア iOS 開発者 & ジェスチャ初心者

編集:この質問からの提案の 1 つに従って、UISubView のサブクラスを実装してデフォルトの touchesBegan メソッドをオーバーライドしようとしましたが、動作させることができませんでした。

CustomScrollView.h:

@interface CustomScrollView : UIScrollView 
{
}

@end

CustomScrollView.m:

#import "CustomScrollView.h"

@implementation CustomScrollView

- (id)initWithFrame:(CGRect)frame 
{
  return [super initWithFrame:frame];
}

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event 
{   
  // What goes here so that The action it can be called from the ViewController.h
}

@end

ViewController.h:

#import <UIKit/UIKit.h>

@class CustomScrollView;

@interface ViewController : UIViewController <UIScrollViewDelegate>
{
  CustomScrollView *scrollView;
}

@end

ViewController.m:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 
{
  // What goes here?
}
4

4 に答える 4

2

ScrollView をサブクラス化し、次のメソッドを実装します。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
  if(gestureRecognizer.numberOfTouches != 2) {
    return NO;
  } else {
    return YES;
  }
}
于 2016-11-30T07:39:22.643 に答える
0

この問題に取り組むための出発点は、UIViewメソッドに従うことだと思います。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

このメソッドが呼び出されると、タッチ位置やタッチ回数などを確認して、使用するレコグナイザーを決定できます。UIScrollViewサブクラスを作成してオーバーライドするとgestureRecognizerShouldBegin、UIScrollViewのデフォルトのジェスチャレコグナイザー(パン/ズーム)も制御できます。

もちろん、scrollEnabledプロパティを使用する必要はありません。

于 2013-01-17T15:57:48.737 に答える
0

UIScrollView をサブクラス化し、メソッド touchesShouldBegin:withEvent:inContentView: をオーバーライドしてみてください。ドキュメントには次のように記載されています。

サブクラスによってオーバーライドされ、表示されたコンテンツに指が触れたときのデフォルトの動作をカスタマイズします。

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view

したがって、複数のタッチがあり、その場合にのみ真の値を返すかどうかを確認できる場合があります。

于 2013-01-17T12:52:32.273 に答える
-1

これを試して

  - (void)viewDidLoad
{  

    [super viewDidLoad];


    UISwipeGestureRecognizer *swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(upCommand)];
    swipeUpRecognizer.delegate = self;
    [swipeUpRecognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [self.view addGestureRecognizer:swipeUpRecognizer];
    scrollView.delegate = scrollView;

    panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)];
    panGestureRecognizer.minimumNumberOfTouches = 1;
    panGestureRecognizer.maximumNumberOfTouches = 1;
    [self.scrollView addGestureRecognizer:panGestureRecognizer];

}
-(void)upCommand
{
    NSLog(@"up");    
}
-(void)viewDidAppear:(BOOL)animated
{
    scrollView.contentSize = CGSizeMake(320, 600);
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)recognizePan:(UIGestureRecognizer*)recognizer
{
    NSLog(@"pan");//Does nothing but catches the pan of scrollview so it doesnt scroll


}
//simultan recognition of pan and gesture
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

パンレコグナイザーはScrollviewで1本の指のスワイプをキャッチするため、ビューはスクロールせず、

shouldRecognizeSimultaneouslyWithGestureRecognizer

パンとジェスチャーの両方がキャッチされるようにします。

それで全部です

追加する必要がある編集

<UIGestureRecognizerDelegate>

.hファイルに

于 2013-01-17T16:09:07.113 に答える