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 startif(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
}
}