5

我正在寻找如何通过 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 覆盖默认手势操作,或者在操作系统接收到它们时识别它们?

4

6 回答 6

6

watchOS 3 增加了对WKGestureRecognizer.

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

这是他们代码中的一个片段,显示了 Storyboard 中配置的两个手势操作:

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()
        }
    }
于 2016-06-13T21:06:57.003 回答
3

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

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

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

Apple Watch 不支持捏合等多指手势。

...取自 Apple iWatch 人机界面指南。所以我不认为这个“黑客”会给你与 iOS 相同的行为。

于 2014-12-29T14:36:54.950 回答
3

据我所知,没有办法做到这一点。整个 Apple Watch 的用途非常有限。我认为这是有道理的,因为它应该只是您的主应用程序的外围设备,但它对我的喜好来说有点太有限了。

于 2014-12-17T11:43:14.987 回答
2

Apple 会自动向用户提供滑动手势以在控制器中前后导航,并滚动 Watch 布局的视图。所有这些都不需要第三方开发人员进行任何代码或手势配置即可完成。我们所能做的就是在 Interface Builder 中定义对象的 segues 和布局,其余的由操作系统负责。

目前在 WatchKit 中无法直接访问滑动或其他手势或点击位置,并且没有理由相信在 Watch 发布之前这种情况会发生变化。

目前尚不清楚 Apple 是否愿意在未来启用此功能,或者他们是否永远不会向开发人员开放此功能,但他们鼓励开发人员通过他们的bug 报告器提交增强请求。请务必描述您想要的用例和您要解决的问题,以及您提出的解决方案是什么,因为他们可能提供不同的工具来解决您的问题,即使它是在一个与我们预期不同的方式。

于 2015-01-11T02:13:51.243 回答
0

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

于 2015-01-10T02:59:51.000 回答
0

我使用 Xcode 7.2 目前为 watchos2 编码,对于我的应用程序,我只希望按钮在 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"];

        }

当然,您可以调整 afterDelays 等,并清理代码,但这就是我能够让双击工作的方式

于 2016-02-02T23:35:32.877 回答