Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果顶级UIView没有收到它想要处理的手势,是否将手势/触摸传递给另一个UIView?_Ios_Xamarin_Uiview_Uigesturerecognizer_Gesture - Fatal编程技术网

Ios 如果顶级UIView没有收到它想要处理的手势,是否将手势/触摸传递给另一个UIView?

Ios 如果顶级UIView没有收到它想要处理的手势,是否将手势/触摸传递给另一个UIView?,ios,xamarin,uiview,uigesturerecognizer,gesture,Ios,Xamarin,Uiview,Uigesturerecognizer,Gesture,我在这里发现了一些类似的问题,但没有一个能满足我的要求 我的问题是:我用控件、集合视图和其他一些东西设置了UIView。标准的iOS操作系统 当用户用两个手指在屏幕上向下平移时,一个搜索栏应该从顶部下降,主UIView也会下降一点 我试图实现这一点的方法是在顶层创建一个UIView,拦截所有触摸和手势。我想让它做的是忽略不是两个手指平移的手势,并将它们作为原始输入传递,以便应用程序的其余部分可以正常运行 我不能简单地将平移手势识别器添加到根视图,因为集合视图似乎会阻止平移到根视图 你知道如何做到

我在这里发现了一些类似的问题,但没有一个能满足我的要求

我的问题是:我用控件、集合视图和其他一些东西设置了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检查我编辑后的代码是否适合你。你找到解决方案了吗?你找到解决方案了吗?