Как определить движение трясти в 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:^{ ... }];