Apple Watch中的手势识别(WatchKit)

我正在寻找如何通过WatchKit SDK在Apple Watch应用程序中检测手势。 在iOS中,我们可以使用这样的代码:

- (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeRightBlack = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)]; swipeRightBlack.direction = UISwipeGestureRecognizerDirectionRight; [self.viewBlack addGestureRecognizer:swipeRightBlack]; } 

…但是这在Apple Watch模拟器中不起作用。 有没有办法来覆盖使用WatchKit的默认手势操作,或者只是当操作系统接收到它们时识别它们?

watchOS 3增加了对WKGestureRecognizer的第三方支持。

Apple还更新了他们的WatchKit Catalog示例代码,以包含一个WKInterfaceController手势示例,演示如何在Apple Watch上使用各种手势。

以下是代码片段,其中显示了Storyboard中configuration的两个手势动作:

 class GestureDetailController : WKInterfaceController { @IBOutlet var tapGroup: WKInterfaceGroup! @IBOutlet var panGroup: WKInterfaceGroup! ... @IBAction func tapRecognized(_ sender: AnyObject) { tapGroup.setBackgroundColor(UIColor.green()) scheduleReset() } @IBAction func panRecognized(_ sender: AnyObject) { if let panGesture = sender as? WKPanGestureRecognizer { panGroup.setBackgroundColor(UIColor.green()) panLabel.setText("offset: \(NSStringFromCGPoint(panGesture.translationInObject()))") scheduleReset() } } 

不知道这是如何实现的:在苹果的演示video中,行中的组被左移,并显示下面的button。

在这里输入图像说明

据我所知,没有办法做到这一点。 整个苹果手表是超级有限的,当涉及到你能用它做什么。 我想这是有道理的,因为它应该只是你的主应用程序的外围设备,但是对于我的喜好来说它有点太有限了。

你读过“iWatch指南”吗? 苹果说:

手势:系统代表您处理所有手势,使用它们来实现标准的行为:

  • 垂直滑动滚动当前屏幕。
  • 水平滑动显示基于页面的界面中的上一页或下一页。
  • 左边滑动导航回到父界面控制器。
  • 点击表示select或交互。 点击由系统处理并报告给你的WatchKit扩展的操作方法。

Apple Watch不支持多指手势,如捏。

…从苹果iWatch人机接口指南中获取。 所以我不认为这个“黑客”会给你和iOS一样的行为。

Apple自动向用户提供轻扫手势,通过您的控制器前后导航,并滚动Watch已经布置的视图。 所有这些都是在不需要第三方开发者的任何代码或手势configuration的情况下完成的。 我们所能做的就是在界面生成器中定义对象的细节和布局,操作系统负责处理其余部分。

目前在WatchKit中没有直接进入滑动或其他手势或点击位置,也没有理由相信在手表发布之前会发生改变。

目前还不清楚苹果是否愿意在未来实现这一目标,或者他们是否永远不会向开发者开放,但他们正在鼓励开发者通过他们的bug记者提交改进请求。 一定要描述你想要的用例和你正在试图解决的问题,以及你提出的解决scheme是什么,因为他们可以提供不同的工具来解决你的问题,即使它在不同于我们预期的方式。

你还不能做。 现在的替代选项是使用屏幕内的button来执行滑动操作。

我使用Xcode 7.2目前编码为watchos2,对于我的应用程序,我只想要button执行一个方法,当他们双击0.5秒内,如果用户只有单一的水龙头,那么将不会执行的行动。 例如:

在我的.h

 #import <WatchKit/WatchKit.h> #import <Foundation/Foundation.h> @interface InterfaceController : WKInterfaceController - (IBAction)btnActivate; @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceButton *activateBtn; @end 

在我的.m文件的顶部,我声明:

  int taps = 1; - (IBAction)btnActivate { taps = taps + 1; if (taps == 2){ [activateBtn setBackgroundColor:[UIColor grayColor]]; [self performSelector:@selector(tapOne:) withObject:self afterDelay:0.5]; } else if (taps == 3){ [self performSelector:@selector(tapTwo:) withObject:self afterDelay:0]; [activateBtn setEnabled:NO]; [activateBtn setBackgroundColor:[UIColor redColor]]; } else { //Do other things here if you want } } - (void) tapOne: (id) sender{ if (taps == 2){ [self performSelector:@selector(afterTapDone:) withObject:self afterDelay:1]; } else { } } - (void) tapTwo: (id) sender { //Perform button actions here when user double taps [self performSelector:@selector(afterTapDone:) withObject:self afterDelay:10]; } - (void) afterTapDone: (id) sender { taps = 1; [activateBtn setEnabled:YES]; [activateBtn setBackgroundColor:[UIColor colorWithRed:0/255.0f green:174/255.0f blue:239/255.0f alpha:1.0f]]; [activateBtn setTitle:@"Activate"]; } 

当然,你可以调整afterDelay等,并清理代码,但这是我能够得到双水龙头工作