Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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 使用自定义手势识别器触发UIScrollView的滚动_Ios_Uiscrollview_Gesture_Gesture Recognition - Fatal编程技术网

Ios 使用自定义手势识别器触发UIScrollView的滚动

Ios 使用自定义手势识别器触发UIScrollView的滚动,ios,uiscrollview,gesture,gesture-recognition,Ios,Uiscrollview,Gesture,Gesture Recognition,我找不到替换UIScrollView的默认UIPangestureRecognitor的方法。但是,我需要调整导致UIScrollView滚动的手势 我只想识别速度更快的盘子。此外,手指移动一定距离后,要测量其速度(确保它不是最初的慢动作)。据我所知,这无法通过UScrollView的默认uipangestrerecognizer实现 如何用我自己的识别器替换它?您可以尝试在scrollView上放置一个清晰的UIView,然后向其中添加一个UIPangestureRecognitor。然后,您

我找不到替换
UIScrollView
的默认
UIPangestureRecognitor
的方法。但是,我需要调整导致
UIScrollView
滚动的手势

我只想识别速度更快的盘子。此外,手指移动一定距离后,要测量其速度(确保它不是最初的慢动作)。据我所知,这无法通过
UScrollView
的默认
uipangestrerecognizer
实现


如何用我自己的识别器替换它?

您可以尝试在scrollView上放置一个清晰的UIView,然后向其中添加一个UIPangestureRecognitor。然后,您可以为该手势识别器设置一个选择器,该选择器可以告诉scrollView滚动。但是,您将负责确定每个高速平移的滚动距离。

更改基本手势识别器是错误的做法。您想要做的事情可能可以通过实现的方法来完成


只要要自定义的滚动视图不是UICollectionView、UITableView或类似类的一部分,就可以设置手势识别器的委托。然后,在代理中,您可以使用UIPangestureRecognitizer的方法来决定是否允许手势识别器触发滚动。

您也可以在此处实现touchesMoved方法。你可以在触摸之间做一个比较来检查速度。类似这样的东西,但它是伪代码

global firstpoint;
global secondpoint

override func touchesBegan(touches: NSSet, withEvent event: UIEvent){

for touch: AnyObject in touches {
        let firstpoint = (touch as UITouch).locationInNode(self);

}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches {
        let secondpoint = (touch as UITouch).locationInNode(self);
    }
    let diffx = secondpoint - firstpoint;
    if diffx > "some value you choose for velocity"{
         "do some action that you want";
    }
    else {
        firstpoint = secondpoint;
    }
}   

这将给你一些运动的速度,你可以用它来提供进一步的动作

您使用的是Objective-C还是Swift?@A.R.Younce我使用的是Swift。但是Objective-C可以实现的一切都应该可以通过Swift实现,对吗?目前UIGestureRecognitor的自定义子类不能用Swift编写。我只是想知道如何帮助您生成示例代码。@A.R.Younce可以用Objective-C编写。我找到了一种方法,可以将
UIgestureRecograiser
子类化。虽然它有一个缺点,但我可以忍受——所以请随意在Objective-C中发布,我可以将该代码改编为Swift.@A.R.Younce,如果您对我如何子类化
uigestureRecognitizer
:add
import UIKit.uigestureRecognitizer子类
感兴趣,谢谢您,但我必须不同意。目前,我已经在使用委托-不是方法
shouldReceiveTouch
,而是
手势识别器shouldBegin
。它不能做需要的事情。要完成我所需要的,只使用代理过滤触摸可能是可能的,但非常复杂。更重要的是,它将
UIPangestureRecognitor
侵入到识别不同手势的过程中,然后通过其代理进行平移。绝对不是正确的方式。委托不是它的肉,因此它没有提供足够的控制。这根本不是同一个手势,我需要不同的识别器。不鼓励操纵UIKit框架类的手势识别器,原因与操纵它们的私有视图相同。您的应用程序在进行内部更改时可能会中断。如果使用委托对您不起作用,那么您可能需要一个自定义滚动视图(而不是UIScrollView子类)。好吧,如果无法以某种有文档记录的方式替换默认的平移识别器,我将需要进行更多的编码,以重新创建整个拖动和滚动功能,就像您建议的那样。但在那之前,我会在这个问题上悬赏,看看结果如何。ThanksI可以将
UIPangestureRecognitizer
直接添加到
UIRollView
中,并通过设置
scrollEnabled=false
(或通过实现
UIgestureRecognitizerDelegate
的方法
在滚动视图上应接收触摸
,并始终返回
false
)来禁用默认识别器。确定高速平移的滚动距离也不是问题。我的想法是,我不想失去跳转和分页功能——当
contentOffset
或visible rect以编程方式设置在
UIScrollView
上时,它不会跳转,也不会移动到最近的页面。