問題は UIScrollView のみにあり、私もそれについて激怒しました: http://i.stack.imgur.com/dqx3d.png
[更新 1] ここで解決策:
状況: UIViewController のビューには、サブビューとして UIScrollView があります (スクロール ビューのページングが無効になっています)。
ジェスチャーを UIView にアタッチするために使用するコード:
UISwipeGestureRecognizer *swipeLeftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedScreenLeft:)];
[swipeLeftRecognizer setNumberOfTouchesRequired:2.0f];
swipeLeftRecognizer.delegate = self;
[swipeLeftRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.view addGestureRecognizer:swipeLeftRecognizer];
[swipeLeftRecognizer release];
iOS 4.3 を有効にするには、UIViewController をUIGestureRecognizerDelegate
次に、次のデリゲート メソッドを使用して、scrollView の panGesture とビューのスワイプ 1 を同時に認識できるようにしました。ここにコード:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
return YES;
}
return NO;
}
[更新 2]
2 本の指で UIScrollView のパンを無効にするには、UISCrollView クラスのカスタム サブクラスである scrollview を作成し、panGesture 検出器の動作を変更する必要があると思いますが、それをしようとはしませんでした。代わりに、怠惰なソリューションを選択しました。基本的には、UISwipeGestureRecognizer の現在の状態に基づいて scrollView スクロール機能を有効/無効にします。さらに、反対方向へのダブルタッチの動きも防止するために、別の認識機能を追加しました。
スワイプ検出器用に 2 つのプロパティを作成する必要があります。
@property (nonatomic,assign) UISwipeGestureRecognizer *swipeRightRecognizer;
@property (nonatomic,assign) UISwipeGestureRecognizer *swipeLeftRecognizer;
次に、次のようにコーディングしました。
[self setSwipeRightRecognizer:[[UISwipeGestureRecognizer alloc] initWithTarget:nil action:nil]];
[swipeRightRecognizer setNumberOfTouchesRequired:2.0f];
swipeRightRecognizer.delegate = self;
[swipeRightRecognizer setDirection:UISwipeGestureRecognizerDirectionRight];
[self addObserver:self forKeyPath:@"swipeRightRecognizer.state" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
[self.view addGestureRecognizer:swipeRightRecognizer];
[swipeRightRecognizer release];
[self setSwipeLeftRecognizer:[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedScreenLeft:)]];
[swipeLeftRecognizer setNumberOfTouchesRequired:2.0f];
swipeLeftRecognizer.delegate = self;
[swipeLeftRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[self addObserver:self forKeyPath:@"swipeLeftRecognizer.state" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
[self.view addGestureRecognizer:swipeLeftRecognizer];
[swipeLeftRecognizer release];
次に、このメソッドを追加します。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (self.swipeRightRecognizer.state == UIGestureRecognizerStateFailed) {
self.scrollView.scrollEnabled = YES;
return;
}
if ([self.swipeRightRecognizer numberOfTouches] != 2.0f) {
self.scrollView.scrollEnabled = YES;
}
else{
self.scrollView.scrollEnabled = NO;
}
}
そして、以前の「[UPDATE]」で投稿した既存のメソッドを更新します。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
if ([gestureRecognizer numberOfTouches] != 2.0f) {
self.scrollView.scrollEnabled = YES;
}
else{
self.scrollView.scrollEnabled = NO;
}
return YES;
}
return NO;
}
最後に、dealloc でオブザーバーを削除します。
[self removeObserver:self forKeyPath:@"swipeRightRecognizer.state"];
[self removeObserver:self forKeyPath:@"swipeLeftRecognizer.state"];
よりクリーンなソリューションがあるに違いありませんが、うまくいきます..
それが役に立てば幸い ;)