Ios 如果顶级UIView没有收到它想要处理的手势,是否将手势/触摸传递给另一个UIView?
我在这里发现了一些类似的问题,但没有一个能满足我的要求 我的问题是:我用控件、集合视图和其他一些东西设置了UIView。标准的iOS操作系统 当用户用两个手指在屏幕上向下平移时,一个搜索栏应该从顶部下降,主UIView也会下降一点 我试图实现这一点的方法是在顶层创建一个UIView,拦截所有触摸和手势。我想让它做的是忽略不是两个手指平移的手势,并将它们作为原始输入传递,以便应用程序的其余部分可以正常运行 我不能简单地将平移手势识别器添加到根视图,因为集合视图似乎会阻止平移到根视图Ios 如果顶级UIView没有收到它想要处理的手势,是否将手势/触摸传递给另一个UIView?,ios,xamarin,uiview,uigesturerecognizer,gesture,Ios,Xamarin,Uiview,Uigesturerecognizer,Gesture,我在这里发现了一些类似的问题,但没有一个能满足我的要求 我的问题是:我用控件、集合视图和其他一些东西设置了UIView。标准的iOS操作系统 当用户用两个手指在屏幕上向下平移时,一个搜索栏应该从顶部下降,主UIView也会下降一点 我试图实现这一点的方法是在顶层创建一个UIView,拦截所有触摸和手势。我想让它做的是忽略不是两个手指平移的手势,并将它们作为原始输入传递,以便应用程序的其余部分可以正常运行 我不能简单地将平移手势识别器添加到根视图,因为集合视图似乎会阻止平移到根视图 你知道如何做到
你知道如何做到这一点吗?添加一个覆盖视图,仅仅是为了使用平移手势,这是一种过分的做法。如果您从这个覆盖视图中传递所有其他触摸(这是绝对可能的),您将解决错误的问题。 相反,您可以防止集合视图从根视图窃取平移手势的触摸。为此,在根视图上添加平移手势后,在集合视图上迭代所有手势,使它们要求平移手势失败。在下面的代码中,假设
pandownship
是您添加到根视图的两个手指向下平移
for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) {
[recognizer requireGestureRecognizerToFail:panDownGesture];
}
这将避免集合视图在检测到平移手势时获得任何手势
编辑:
根据您的评论,我使用上面显示的相同循环检查了集合视图上的所有默认手势。事实证明,集合视图已经有了一个平移手势,分别是maximumNumberOfTouchs=4294967295
,和minimumNumberOfTouchs=1
。这是与您的下拉手势冲突的手势。要避免这种情况,只需将此平移手势的maximumnumberoftouchs
更改为1。您可以使用上述代码的修改版本执行此操作:
for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) {
if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
((UIPanGestureRecognizer)recognizer).maximumNumberOfTouches = 1;
}
[recognizer requireGestureRecognizerToFail:panDownGesture];
}
警告:这不允许再使用多个手指平移集合视图。使用此代码,您将处于一个有点危险的领域。你不仅仅是在做一个依赖于其他东西的默认手势,而是在改变它的工作方式。希望这不会对收藏视图造成不利影响,您应该能够用一个手指滚动。祝你好运。添加一个覆盖视图,只是为了使用平移手势,这是一种过分的做法。如果您从这个覆盖视图中传递所有其他触摸(这是绝对可能的),您将解决错误的问题。
#import "CustomUiView.h"
@implementation CustomUiView.h
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return NO;
}
@end
相反,您可以防止集合视图从根视图窃取平移手势的触摸。为此,在根视图上添加平移手势后,在集合视图上迭代所有手势,使它们要求平移手势失败。在下面的代码中,假设pandownship
是您添加到根视图的两个手指向下平移
for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) {
[recognizer requireGestureRecognizerToFail:panDownGesture];
}
这将避免集合视图在检测到平移手势时获得任何手势
编辑:
根据您的评论,我使用上面显示的相同循环检查了集合视图上的所有默认手势。事实证明,集合视图已经有了一个平移手势,分别是maximumNumberOfTouchs=4294967295
,和minimumNumberOfTouchs=1
。这是与您的下拉手势冲突的手势。要避免这种情况,只需将此平移手势的maximumnumberoftouchs
更改为1。您可以使用上述代码的修改版本执行此操作:
for (UIGestureRecognizer *recognizer in self.collectionView.gestureRecognizers) {
if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
((UIPanGestureRecognizer)recognizer).maximumNumberOfTouches = 1;
}
[recognizer requireGestureRecognizerToFail:panDownGesture];
}
警告:这不允许再使用多个手指平移集合视图。使用此代码,您将处于一个有点危险的领域。你不仅仅是在做一个依赖于其他东西的默认手势,而是在改变它的工作方式。希望这不会对收藏视图造成不利影响,您应该能够用一个手指滚动。祝你好运
#import "CustomUiView.h"
@implementation CustomUiView.h
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return NO;
}
@end
您不希望交互的视图。
创建自定义UIView类,并将此自定义视图用作在pointInside方法中不返回任何内容的顶部视图。然后触摸将自动进入地下
您不希望交互的视图。
创建自定义UIView类,并将此自定义视图用作在pointInside方法中不返回任何内容的顶部视图。然后触摸将自动进入地下 不幸的是,这不起作用,因为UICollectionView开始表现出奇怪的行为-它不会跟随用户的手指上下平移。如果您为您的
Pandown手势设置MinimumNumberOfTouchs=2
和MaximumNumberOfTouchs=2
,则单次触摸将无法检测到平移。这将避免与任何其他视图上的所有其他手势发生冲突。当然,对集合视图本身进行2次手指平移将不起作用。我尝试过这样做,但根据scrollview内容是否大于其边界,我得到了不同的行为(当内容小于其边界时,似乎会忽略它)@soshiki检查我编辑后的代码是否对您有效。不幸的是,这不起作用,因为UICollectionView开始表现出奇怪的行为-它不会跟随用户手指上下移动。如果您为您的Pandown手势设置MinimumNumberOfTouchs=2
和MaximumNumberOfTouchs=2
,单触不可检测到平移向下。这将避免与任何其他视图上的所有其他手势发生冲突。当然,对集合视图本身进行2次手指平移将不起作用。我尝试过这样做,但根据scrollview内容是否大于其边界,我得到了不同的行为(当内容小于其边界时,似乎会忽略它)@soshiki检查我编辑后的代码是否适合你。你找到解决方案了吗?你找到解决方案了吗?