lra*_*135 9 objective-c uiscrollview ios uipangesturerecognizer
我正在尝试实现UIScrollView,其中水平平移滚动浏览滚动视图中的图片,但垂直平移执行我的另一个操作.现在我有一个UIScrollView分页显示垂直滚动禁用,可以很好地滚动浏览图片,但我疯了,试图找到一种方法来拦截垂直平底锅,并调用我自己的方法而不是垂直平底锅只是被吃掉了滚动视图.我能够做到
UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];
Run Code Online (Sandbox Code Playgroud)
这使我可以完全控制我的handlePanGesture:方法中的平移,但这并不是特别有用,因为我觉得我基本上将重写所有我想避免的滚动逻辑.任何有关如何实现这一目标的帮助或指导将不胜感激.
谢谢!
Zev*_*erg 10
从iOS 5开始,UIScrollView 暴露它UIPanGestureRecognizer.将自定义滑动设置delegate为self并将gestureRecognizer设置为属性或ivar,并使您的类符合<UIGestureRecognizerDelegate>协议.然后,实施UIGestureRecognizerDelegate的– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:,像这样:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
{
return NO;
}
return YES; // the default for this method
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个像这样的UIPanGestureRecognizer设置gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer::
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
return YES;
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
我还加了一张支票 gestureRecognizerShouldBegin:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture]) {
if (gestureRecognizer.numberOfTouches > 0) {
CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
if (distX > distY) {
return NO;
}
} else {
return NO;
}
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
仅self.panGesture在向上或向下平移时使用.
更新
/sf/answers/602268761/似乎有更好的方法gestureRecognizerShouldBegin
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture]) {
if (gestureRecognizer.numberOfTouches > 0) {
CGPoint translation = [self.panGesture velocityInView:self.collectionView];
return fabs(translation.y) > fabs(translation.x);
} else {
return NO;
}
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我认为如果您想使用平移手势,这会很困难,因为滚动视图使用了这些手势。但是,如果您可以使用滑动操作,则很容易实现。
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
[self.scrollView addGestureRecognizer:swipe];
Run Code Online (Sandbox Code Playgroud)
我对此进行了测试,调用处理程序效果很好,并且您不需要禁用滚动视图的平移手势识别器(在我的测试中,滚动视图足够高,内容足够短,因此没有垂直滚动 - - 我不知道这是否有必要)。
| 归档时间: |
|
| 查看次数: |
12297 次 |
| 最近记录: |