【发布时间】:2023-03-15 18:34:01
【问题描述】:
我正在开发一个带有手势系统的应用程序,基本上,如果我将 iPhone 向左转,我的应用程序将执行一个功能,如果我将 iPhone 向右转,其他功能,其他手势。
我不知道如何使用它,我正在尝试在 google 中搜索但不起作用,结果只是触摸手势而不是动作手势。
有人有教程可以帮助我吗?
【问题讨论】:
标签: ios iphone xcode swift gesture
我正在开发一个带有手势系统的应用程序,基本上,如果我将 iPhone 向左转,我的应用程序将执行一个功能,如果我将 iPhone 向右转,其他功能,其他手势。
我不知道如何使用它,我正在尝试在 google 中搜索但不起作用,结果只是触摸手势而不是动作手势。
有人有教程可以帮助我吗?
【问题讨论】:
标签: ios iphone xcode swift gesture
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")
}
}
【讨论】:
斯威夫特 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 之前,这对我不起作用。
这已针对 IOS 12 进行了更新 - 请参阅 Apple Docs 您不再需要添加 becomeFirstResponder() 方法。
您只需将motionEnded 函数添加到您的代码中。
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
{
// code here
}
【讨论】:
becomeFirstResponder的证明或文档链接。
Swift 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。
【讨论】:
斯威夫特 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?");
}
}
【讨论】: