我正在尝试创建一个长按手势,一旦按住 3 秒钟,就会显示第二个视图控制器。但是,如果设备在整个 3 秒内处于某个加速度计方向,我只希望显示第二个视图控制器。也就是说,如果手势没有保持足够长的时间或设备倾斜太多,则手势将被取消,用户必须重试。
// 在 FirstViewController.h 中
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface FirstViewController : UIViewController
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
// 在 FirstViewController.m 中
#import "FirstViewController"
#import "SecondViewController"
@implementation motionManager;
- (void) viewDidLoad
{
[super viewDidLoad];
self.motionManager = [[CMMotionManager alloc]init];
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 3.0;
[self.view addGestureRecognizer:longPress];
}
- (void) handleLongPress: (UILongPressGestureRecognizer *)sender
{
// Not sure what to do here
}
我之前在最后一种方法中尝试过大量代码,但它看起来很讨厌,而且不正确。相反,我在下面列出了几行我知道单独工作的代码,但我需要帮助才能使它们一起工作。
// 加速度计
if ([self.motionManager isAccelerometerAvailable])
{
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData,NSError *error)
{
if (ABS(accelerometerData.acceleration.x) < 0.3 && ABS(accelerometerData.acceleration.y) < 0.30 && ABS(accelerometerData.acceleration.z) > 0.70) // Phone is flat and screen faces up
{
NSLog(@"Correct Orientation!!!");
[self.motionManager stopAccelerometerUpdates];
}
else
{
NSLog(@"Incorrect orientation!!!");
[self.motionManager stopAccelerometerUpdates];
}];
}
else
{
NSLog(@"Accelerometer is not available.");
}
// 转到第二个视图控制器
if (sender.state == UIGestureRecognizerStateBegan)
{
SecondViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self presentViewController:svc animated:YES completion:nil];
}
有任何想法吗?或者,除非满足条件,否则取消手势的更通用方法将非常有帮助。