繁体   English   中英

Apple Watch(WatchKit)中的手势识别

[英]Gesture recognition in 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目录示例代码,以包含一个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()
        }
    }

想知道这是如何实现的:在Apple的演示视频中,行中的组向左滑动,下面的按钮显示出来。

在此输入图像描述

据我所知,没有办法做到这一点。 整个Apple Watch在你能用它做什么方面是超级受限的。 我认为那种有意义,因为它应该只是你的主应用程序的外围设备,但它有点太限,我喜欢。

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

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

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

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

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

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

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

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

你还做不到。 现在的另一种选择是使用屏幕内的按钮来执行滑动操作。

我正在使用目前编码为watchos2的Xcode 7.2,对于我的应用程序,我只希望按钮在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等,并清理代码,但这就是我能够让双击工作的方式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM