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 を使用してデフォルトのジェスチャー アクションをオーバーライドする方法、または OS が受け取ったときにそれらを認識する方法はありますか?

4

6 に答える 6

6

watchOS 3 では、サードパーティのサポートが追加されましWKGestureRecognizerた。

Apple はまた、WatchKit カタログのサンプル コードを更新して、Apple Watch でさまざまなジェスチャを使用する方法を示す WKInterfaceController ジェスチャの例を含めました。

以下は、ストーリーボードで構成されたジェスチャの 2 つのアクションを示すコードのスニペットです。

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 に答える
2

Apple は、スワイプ ジェスチャをユーザーに自動的に提供して、コントローラを前後にナビゲートし、Watch がレイアウトしたビューをスクロールします。これらはすべて、サード パーティの開発者によるコードやジェスチャ構成を必要とせずに実行されます。私たちができることは、Interface Builder でオブジェクトのセグエとレイアウトを定義することだけで、残りは OS が処理します。

現在、スワイプやその他のジェスチャ、または WatchKit のタップ位置に直接アクセスすることはできず、Watch のリリース前に変更されると信じる理由はありません。

Apple が将来これを有効にするつもりなのか、それとも開発者にこれを公開しないのかは不明ですが、開発者がバグレポーターを通じて機能強化のリクエストを送信することを奨励しています。希望するユース ケースと解決しようとしている問題、および提案するソリューションを必ず説明してください。私たちの予想とは違う方法です。

于 2015-01-11T02:13:51.243 に答える
0

私は現在watchos2のコーディングをしているXcode 7.2を使用しています。私のアプリでは、.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 に答える
0

まだできません。現在の代替オプションは、画面内のボタンを使用してスワイプ アクションを実行することです。

于 2015-01-10T02:59:51.000 に答える