UIScrollView
の左/右スワイプジェスチャを認識しようとしています。私はUISwipeGestureRecognizers
を作成してスクロールビューに関連付けようとしました。それは動作しますが、非常にまれです。ほとんどの場合、呼び出されません。どうして?
確実に左/右にスワイプして機能させるにはどうすればよいですか?ジェスチャレコグナイザを使用できますか、それともtouchesBegan/Ended
で自分で処理する必要がありますか?
ありがとう
理解した。私の場合、UIScrollViewには、ズームを許可したUIImageが含まれていました。どうやらこれはスクロールが有効になっていて、UIScrollViewがスクロールとスワイプ(次の前の画像)を意図したジェスチャーを区別するのに問題があったことを意味していました。
私の場合の重要な点は、画像が拡大されていない場合はスクロールビューでのスクロールを無効にし、拡大されている場合は再度有効にすることです。これにより、期待どおりの動作が得られます。
重要なのは、スクロールビューのデリゲートに以下を配置することです。
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
if (scrollView.zoomScale!=1.0) {
// Zooming, enable scrolling
scrollView.scrollEnabled = TRUE;
} else {
// Not zoomed, disable scrolling so gestures get used instead
scrollView.scrollEnabled = FALSE;
}
}
また、スクロールを無効にしてスクロールビューを初期化する必要があります。ズームを有効にするには、デリゲートコールで画像を提供するだけです。
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
// Return the scroll view
return myImage;
}
また、viewDidLoadでいくつかのパラメーターを設定して、ズームとセットアップのジェスチャー認識機能も設定します。
- (void)viewDidLoad {
[super viewDidLoad];
myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height);
myScrollView.maximumZoomScale = 4.0;
myScrollView.minimumZoomScale = 1.0;
myScrollView.clipsToBounds = YES;
myScrollView.delegate = self;
[myScrollView addSubview:myImage];
[self setWantsFullScreenLayout:TRUE];
myScrollView.scrollEnabled = FALSE;
UISwipeGestureRecognizer *recognizer =
[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
recognizer.delaysTouchesBegan = TRUE;
[myScrollView addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
recognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[myScrollView addGestureRecognizer:recognizer];
[recognizer release];
[myScrollView delaysContentTouches];
}
UIScrollView *scrollView = ...
UISwipeGestureRecognizer *mySwipe = ...
この問題を修正する正しい解決策は、1行のコードを追加することです。
[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe]
Swiftバージョン:
scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe)
Swift4バージョン:
scrollView.panGestureRecognizer.require(toFail: mySwipe!);
良いポスト。
私は同じようなことをしていて(画像ビューなし)、contentSizeが高さよりも小さい場合はスクロールを無効にする必要がありました(スクロールビューは垂直方向にしかスクロールしません)。
if (scrollView.contentSize.height>scrollView.frame.size.height) {
scrollView.scrollEnabled = YES;
}
else {
scrollView.scrollEnabled = NO;
}
それは私のためのトリックをしました
スワイプジェスチャー認識機能をアニメーション化してカスタマイズしたい人のために。
UIScrollViewおよびUIGestureRecognizerデリゲートを使用できます。
Class ViewController: UIViewController, UISCrollViewDelegate, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
swipeLeft.delegate = self
swipeRight.delegate = self
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return true
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return scrollView.alwaysBounceHorizontal
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// Your custom animation at the end of scrolling.
}
}