在摇晃iPhone设备上我希望调用一些功能,我不知道如何识别抖动所以我尝试了一些链接并尝试了这段代码
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if(event.type == UIEventSubtypeMotionShake) { NSLog(@"called"); [self.view setBackgroundColor:[UIColor greenColor]]; } } - (BOOL)canBecomeFirstResponder { return YES; }
但是唉没有运气所以你能告诉我如何做同样的事情
谢谢和问候
答案 0 :(得分:32)
根据上面讨论的评论,我正在回答我的问题,以便其他人可以阅读我所拥有的解决方案
在UIResponder类文档中,据说运动事件只会响应第一响应者,所以我所做的只是添加一个小函数,这对我来说很有用,所以这是我的解决方案
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if(event.type == UIEventSubtypeMotionShake) { NSLog(@"called"); [self.view setBackgroundColor:[UIColor greenColor]]; } } - (BOOL)canBecomeFirstResponder { return YES; }
现在我仍然无法检测到任何摇晃动作,所以我所要做的就是让我的视图控制器成为第一响应者,而这就是我使用的代码
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self becomeFirstResponder]; }
我完成了
这是我提出的解决方案
谢谢和问候
答案 1 :(得分:2)
你可以这样做......
...首先
在App的委托中设置applicationSupportsShakeToEdit属性:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
application.applicationSupportsShakeToEdit = YES;
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
...其次
在视图控制器中添加/覆盖canBecomeFirstResponder,viewDidAppear:和viewWillDisappear:方法:
-(BOOL)canBecomeFirstResponder {
return YES;
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated {
[self resignFirstResponder];
[super viewWillDisappear:animated];
}
...第三
将motionEnded方法添加到View Controller:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (motion == UIEventSubtypeMotionShake)
{
// your code
}
}
如果第一个答案没有,这应该有效,而且只是快速输入未经测试:)
答案 2 :(得分:0)
要全局处理应用程序的所有屏幕上的抖动,您可以继承UIWindow并实现motionEnded,因为事件将使响应程序链冒泡,直到它到达窗口对象。使用Xamarin的例子:
public class MyWindow : UIWindow
{
public MyWindow(CoreGraphics.CGRect frame)
: base (frame)
{ }
public override void MotionEnded (UIEventSubtype motion, UIEvent evt)
{
if (motion == UIEventSubtype.MotionShake) {
Console.WriteLine ("Shake received");
}
}
}
接下来,在AppDelegate中,实现window方法以返回UIWindow子类的实例。使用Xamarin的例子:
public class AppDelegate : UIApplicationDelegate
{
UIWindow _window;
public override UIWindow Window
{
get
{
if (_window == null) {
_window = new MyWindow (UIScreen.MainScreen.Bounds);
}
return _window;
}
set
{
}
}
// ...
}
Voilà,震动在整个应用程序中处理。
答案 3 :(得分:0)
SSEventListener让事情变得更轻松。您的视图控制器不再需要覆盖motionEnded:withEvent:
!使用SSEventListener
,您可以像这样简单地听取震动事件:
[viewController ss_setShakeEventListener:^{ ... }];