IOS: Как определить движение дрожания?
Я добавил следующий код в свой appDelegate.m
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (motion == UIEventSubtypeMotionShake )
{
// User was shaking the device. Post a notification named "shake".
[[NSNotificationCenter defaultCenter] postNotificationName:@"shake" object:self];
}
}
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}
- (void)shakeSuccess
{
// do something...
}
а затем я добавил:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// INIT THE BACKGROUND PATH STRING
[self refreshFields];
[self.window addSubview:navController.view];
[self.window makeKeyAndVisible];
***[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeSuccess) name:@"shake" object:nil];***
return YES;
}
Когда я запускаю свое приложение на своем iPhone, метод с именем "shakeSuccess" не вызывается.
Что делать, чтобы реализовать эту функцию в моем приложении?
любая идея?
Ответы
Ответ 1
Это может помочь вам...
fooobar.com/questions/19246/...
Он говорит, что вы должны установить UIApplication
applicationSupportsShakeToEdit
на
YES
. и переопределить 3 метода в вашем VC:
-(BOOL)canBecomeFirstResponder {
return YES;
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated {
[self resignFirstResponder];
[super viewWillDisappear:animated];
}
Остальная часть вашего кода в порядке. (-motionEnded:withEvent:
)
Ответ 2
Вы можете сделать что-то вроде этого...
Во-первых,...
Задайте свойство 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 в ваш контроллер просмотра:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (motion == UIEventSubtypeMotionShake)
{
// your code
}
}
Это должно работать, если первый ответ не был, и это только быстро напечатано не проверено:)
Ответ 3
Если вы хотите обнаружить движение дрожания в приложении, лучший способ - переопределить класс вашего приложения с помощью специального класса.
И затем реализуйте это в своем классе пользовательских приложений
@implementation PSApplication
- (void)sendEvent:(UIEvent *)event
{
if ( event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake ) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"shakeNotification" object:nil];
}
[super sendEvent:event];
}
@end
Ответ 4
Я расширил класс UIApplication и добавил ссылку на main:
MyApplication.h
@interface MyApplication : UIApplication
@end
MyApplication.m
@implementation MyApplication
- (void) sendEvent:(UIEvent *)event
{
if( event && (event.subtype==UIEventSubtypeMotionShake))
{
AppDelegate *objAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[objAppDelegate doWhatEver];
[super sendEvent:event];
}
else
{
[super sendEvent:event];
}
}
@end
И последний шаг в main.m
int main(int argc, char *argv[])
{
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), NSStringFromClass([AppDelegate class]));
}
Это работает во всех случаях.