Как определить движение трясти в iPhone

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

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

- (BOOL)canBecomeFirstResponder
{ 
return YES; 
}

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

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

Ответ 1

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

В документации класса 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];
}

и я был сделан

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

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

Ответ 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

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

    // ...
}

Voilà, shake обрабатывается через все приложение.

Ответ 4

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

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