我的UICollectionView
中有几个UIViewController
。在VC视图的顶部,我有一个UIGestureRecognizer
。
我希望UIGestureRecognizer
启动,制作他的逻辑并将触摸转移到他们的事物的底层视图(比如滚动集合视图)。
我已将UIGestureRecognizer
的属性cancelsTouchesInView设置为NO
。但它没有任何帮助。
这些都没有帮助:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
return YES;
}
return NO;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
return YES;
}
return NO;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
return YES;
}
return NO;
}
答案 0 :(得分:0)
首先,UIGestureRecognizer
是一个抽象基类。您必须指定其子类之一:UITapGestureRecognizer
。
接下来,您必须设置其委托并从YES
委托方法返回shouldRecognizeSimultaneouslyWithGestureRecognizer
。
我认为它应该适用。
但是让我问你一句:为什么不首先使用你的集合视图委托方法didSelectItem:atIndexPath
?
答案 1 :(得分:0)
两年前我遇到了像你这样的问题,但我的问题是使用MKMapView而不是UICollectionView,但我相信我们可以解决它。
您是否检查过您可能没有收到委托邮件,因为UICollectionView正在消耗触摸并且您的手势永远不会到达?
它应该可以工作,但如果没有,请尝试删除您的UICollection仅用于测试,将手势附加到VC的视图上并点击视图以确保手势正常工作。
好的,如果在VC的视图上附加了手势时调用了您的委托,但是在UICollectionView上附加了手势时,我很确定您的手势与UICollectionView的手势之间存在一些手势冲突。 / p>
在这种情况下,循环您的UICollectionView的手势并要求您的手势失败响应。拿这个片段:
for (UIGestureRecognizer *gesture in collectionView.gestureRecognizers) {
[gesture requireGestureRecognizerToFail:yourGesture];
}
或......
将UIView子类化,将其放在视图控制器的最顶层,在UICollectionView上方,并覆盖
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
方法,在里面做你的东西,然后返回nil将触摸传递到上面的视图......
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
//Do your stuff here ... you can also
//return self; if you want to consume the touch
//You can make this UIView's subclasse a "TouchDetector layer"
//and call a delegate from here to notify other classes that
//this view is been touched...
//returning nil, the touch will not be blocked and will be reached
//by the view above it.
return nil;
}
我希望以上其中一个可以解决您的问题。或者至少带你走正路......