Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 是否可以将UIPanGestureRecognizer子类化为';s开始状态在达到某个距离阈值后发生_Ios_Objective C_Uigesturerecognizer_Uipangesturerecognizer - Fatal编程技术网

Ios 是否可以将UIPanGestureRecognizer子类化为';s开始状态在达到某个距离阈值后发生

Ios 是否可以将UIPanGestureRecognizer子类化为';s开始状态在达到某个距离阈值后发生,ios,objective-c,uigesturerecognizer,uipangesturerecognizer,Ios,Objective C,Uigesturerecognizer,Uipangesturerecognizer,我想子类化uipangestureerecognizer,这样在我的子类中,只有在平移过程中达到某个距离阈值后,状态才会更改为uigestureerecognizer状态开始。这意味着经过一定程度的平移后,我希望平移手势的状态变为uigestureRecognitizerStateStart 我尝试插入touchsbegind并手动将状态设置为失败,然后在touchsmoved中将其更新为开始,但我只想将其更改为开始一次(即第一次达到阈值,随后的交互将是UIgestureRecognitizer

我想子类化
uipangestureerecognizer
,这样在我的子类中,只有在平移过程中达到某个距离阈值后,状态才会更改为
uigestureerecognizer状态开始。这意味着经过一定程度的平移后,我希望平移手势的状态变为
uigestureRecognitizerStateStart

我尝试插入
touchsbegind
并手动将状态设置为失败,然后在
touchsmoved
中将其更新为开始,但我只想将其更改为开始一次(即第一次达到阈值,随后的交互将是
UIgestureRecognitizerStateChanged

这可能吗

// called when a gesture recognizer attempts to transition out of UIGestureRecognizerStatePossible. returning NO causes it to transition to UIGestureRecognizerStateFailed
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

在满足条件之前,只需返回“否”。

这里有一个子类似乎可以工作。它会延迟“开始”状态,直到满足所需的距离

DelayedPangestureRecognitor.h:

#import <UIKit/UIKit.h>

@interface DelayedPanGestureRecognizer : UIPanGestureRecognizer

@property (nonatomic, assign) CGFloat delay;

@end
以及行动:

- (void)panned:(DelayedPanGestureRecognizer *)gesture {
    NSLog(@"State: %d", (int)gesture.state);
    NSLog(@"%@", NSStringFromCGPoint([gesture translationInView:gesture.view]));

    if (gesture.state == UIGestureStateBegan) {
        // do something
    } else if (gesture.state == UIGestureStateChanged) {
        // do other things
    }
}

另一方面,您可以只计算平移进度(在0.0~1.0范围内)然后与
.changed
状态中的阈值进行比较。并相应地执行您的工作。是的,这也是我的第一个想法,但我们可能无法依赖于转换到
start
状态,因此我们必须在手势中引入更多带有布尔条件的状态,以确定是否已达到阈值。理想情况下,我只需ant以防止调用开始状态。这不符合我的预期。它看起来像是将y平移乘以一:
trans.y*trans.y
,因此延迟不是线性平移threhald,而是乘以/指数阈值。而且它看起来像是只设置了一次
UIgestureStateStarted
它只需要第一次泛起的翻译。我有一个打字错误。
if
对直角三角形使用了一个简单的毕达哥拉斯定理。是的,
uigesturestatebegind
设置了一次。即使没有这个代码也是这样。当发送
uigesturestatebegind
状态时,这个代码只是延迟。对于在我编写的一个测试iOS应用程序中为我设置。你只需要将
延迟设置为你想要的任何距离。不完全是,这个条件是:if(state==uigestureRecognitizerStateStart)只被点击一次。当你开始做手势时。此时,转换非常小。我想看看当用户按住并继续平移时是否超过阈值。此时,我想调用一些方法。你真的尝试过使用这个自定义识别器吗?它做了你想要的。应用这个
DelayedPanGesTureRecognitizer
到您的视图。设置所需的延迟。在您的操作方法中,检查状态。您将只获得一次
UIgestureRecognitizerStateStart
状态(正常情况下)但是,只有在你进行了足够的平移之后。然后你才能得到所有正常的
更改
事件。我用一个例子更新了答案。是的,我已经将此代码添加到我的自定义平移手势中,但看起来状态只初始化了一次,因此
uigestureRecognitizerStateStart
只调用了一次。更具体地说,我添加了日志函数的状态为if's start
if(state==UIgestureRecognitizerStateStarted){NSLog(@“translation y”);}
我发现translationY在开始时只记录一次。这是一个问题,因为调用方
if(signature.state==UIgestureStateStarted){//do something}
仅在开始平移并且在第一次平移时移动距离时调用。
DelayedPanGestureRecognizer *pan = [[DelayedPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)];
pan.delay = 6;
[someView addGestureRecognizer:pan];
- (void)panned:(DelayedPanGestureRecognizer *)gesture {
    NSLog(@"State: %d", (int)gesture.state);
    NSLog(@"%@", NSStringFromCGPoint([gesture translationInView:gesture.view]));

    if (gesture.state == UIGestureStateBegan) {
        // do something
    } else if (gesture.state == UIGestureStateChanged) {
        // do other things
    }
}