Как обнаружить дрожание в iPhone - PullRequest
14 голосов
/ 18 мая 2011

При встряхивании устройства iPhone я хочу вызвать какую-то функцию, я не знаю, как распознать сотрясение, поэтому я попробовал какую-то ссылку и попробовал этот код

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(event.type == UIEventSubtypeMotionShake)
    {
        NSLog(@"called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

- (BOOL)canBecomeFirstResponder
{ 
return YES; 
}

Но, увы, не повезло, поэтому, пожалуйста, дайте мне знать, как я могу сделать то же самое

Спасибо и С уважением

Ответы [ 4 ]

32 голосов
/ 19 мая 2011

Согласно приведенным выше комментариям я отвечаю на мой вопрос, чтобы другие могли прочитать решение, которое я получил

В документации к классу UIResponder сказано, что события движения будут реагировать только на первый респондент, поэтому я добавил лишь небольшую функцию, и это помогло мне, поэтому вот мое решение

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(event.type == UIEventSubtypeMotionShake)
    {
        NSLog(@"called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

- (BOOL)canBecomeFirstResponder
{ 
return YES; 
}

Теперь я все еще не мог обнаружить движение дрожания, поэтому все, что мне нужно было сделать, это сделать мой viewcontroller первым респондентом, и для этого вот код, который я использовал

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

и я закончил

Это было решение, которое я придумал

Спасибо и всего наилучшего

2 голосов
/ 02 апреля 2013

Вы могли бы сделать что-то вроде этого ...

Во-первых ...

Установите свойство 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
   }
 }

Это должно сработать, если первый ответ не сработал, и это только быстро набрано, не проверено:)

0 голосов
/ 15 января 2018

Все становится проще с SSEventListener . Вашему контроллеру представления больше не нужно переопределять motionEnded:withEvent:! С SSEventListener вы можете прослушивать событие встряхивания так просто:

[viewController ss_setShakeEventListener:^{ ... }];

0 голосов
/ 30 августа 2015

Чтобы глобально обрабатывать дрожание на всех экранах вашего приложения, вы можете создать подкласс 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, реализуйте метод окна, чтобы возвратить экземпляр вашего подкласса 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
        {
        }
    }

    // ...
}

Вуаля, встряска обрабатывается во всем приложении.

...