我正在开发一款手势系统的应用程序,基本上如果我把iPhone向左转,我的应用程序就会执行一个功能,如果我把iPhone向右转,将会执行另一个功能,还有其他手势。
我不知道如何处理这个问题,我试图在谷歌上搜索但是没有结果,只有触摸手势而没有动作手势。
请问是否有人能提供教程帮助我?
我不知道如何处理这个问题,我试图在谷歌上搜索但是没有结果,只有触摸手势而没有动作手势。
请问是否有人能提供教程帮助我?
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: UIEvent.EventSubtype, with event: UIEvent?) {
if motion == .motionShake {
print("Why are you shaking me?")
}
}
非常容易实现:
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")
}
}
Swift 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
}
}
canBecomeFirstResponder
而不是becomeFirstResponder
,这样才能生效。在我将其更改为canBecomeFirstResponder
之前,它并没有起作用。 - Herbal7eaoverride func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
{
// code here
}
becomeFirstResponder
的证明或文档链接。 - Dominik BucherSwift 5
iOS 10+
UIApplication
、UIViewController
、UIView
和UIWindow
默认都是UIResponder
对象,这意味着它们都可以处理动作事件(如抖动)而不需要任何特殊配置。因此,只需覆盖相应的动作方法:
class YourViewController: UIViewController {
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
if motion == .motionShake {
print("device did shake")
}
}
}
此外,您可以覆盖 motionBegan(_:with:)
和 motionCancelled(_:with:)
方法。与覆盖某些触摸事件不同的是,无需调用super方法。
Swift 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")
}
}
}
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?");
}
}