检测摇动手势IOS Swift

问题描述 投票:17回答:7

我正在开发一个带有手势系统的应用程序,基本上如果我将iPhone转向左,我的应用程序将执行一项功能,如果我将iPhone转为右,其他功能,与其他人的手势。

我不知道如何使用它,我正在尝试搜索谷歌但不工作,结果只是触摸手势而不是动作手势。

有人有一个教程来帮助我吗?

ios iphone xcode swift gesture
7个回答
55
投票

Swift3 ios10:

override func viewDidLoad() {
    super.viewDidLoad()
    self.becomeFirstResponder() // To get shake gesture
}

// We are willing to become first responder to get shake motion
override var canBecomeFirstResponder: Bool {
    get {
        return true
    }
}

// Enable detection of shake motion
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        print("Why are you shaking me?")
    }
}

16
投票

超级易于实施:

1)让iOS知道哪个视图控制器是响应者链中的第一个:

override func viewDidLoad() {
    super.viewDidLoad()
    self.becomeFirstResponder()
}   
override func canBecomeFirstResponder() -> Bool {
    return true
}

2)以某种方式处理事件:

override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if(event.subtype == UIEventSubtype.MotionShake) {
        print("You shook me, now what")
    }
}

4
投票

这已针对IOS 12进行了更新 - 请参阅Apple Docs您不再需要添加becomeFirstResponder()方法。

您只需要在代码中添加motionEnded函数。

override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) 
{
    // code here
}

2
投票

斯威夫特5

只需将以下方法添加到ViewController并执行代码即可

    override func becomeFirstResponder() -> Bool {
            return true
      }

     override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
      if motion == .motionShake
      {
            print("Shake Gesture Detected")
            //show some alert here
      }
 }

1
投票

Speedy99的快速回答是在Objective C版本中

- (void)viewDidLoad {
    [super viewDidLoad];
    [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder{
    return true;
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    if(event.subtype == UIEventSubtypeMotionShake){
       NSLog(@"Why are you shaking me?");
    }
}

1
投票

斯威夫特5

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.becomeFirstResponder()
    }

    override var canBecomeFirstResponder: Bool {
        get {
            return true
        }
    }

    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        if motion == .motionShake {
            print("shake")
        }
    }

}

0
投票

swift文件: - https://developer.apple.com/documentation/uikit/uiresponder

为了检测运动事件,swift提供了3种方法: -

  1. func motionBegan() - >告诉接收器动作已经开始
  2. func motionEnded() - >告诉接收器运动事件已结束
  3. func motionCancelled() - >告诉接收者已取消运动事件

例如,如果您想要在摇动手势后更新图像

class ViewController: UIViewController {
   override func motionEnded(_ motion: UIEvent.EventSubtype, with event: 
                                                                        UIEvent?) 
   {
        updateImage()
   }

   UpdateImage(){
      // Implementation
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.