Я предполагаю, что вы хотите реализовать это в подклассе UIViewController
. Сделайте UIViewController
способным стать первым респондентом:
- (BOOL)canBecomeFirstResponder {
return YES;
}
Сделайте UIViewController
первым отвечающим в viewDidAppear:
.
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
}
Если представление содержит какой-либо элемент, такие как UITextField
, который может сам стать первым респондентом, гарантирует, что элемент уйдет в отставку первого респондента в какой-то момент. Например, с UITextField
, UIViewController
должен будет реализовать протокол UITextFieldDelegate
и фактически быть делегатом. Затем в textFieldShouldReturn:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
// Hides the keyboard
[theTextField resignFirstResponder];
// Returns first responder status to self so that shake events register here
[self becomeFirstResponder];
return YES;
}
Реализуйте motionEnded: withEvent:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if ( event.subtype == UIEventSubtypeMotionShake ) {
// Do something
}
if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) {
[super motionEnded:motion withEvent:event];
}
}
Существует хороший пост Мэтта Дранса из Apple на форумах разработчиков iPhone (требуется регистрация в качестве разработчика).
Как обсуждалось в комментарии, это также работает, что неудивительно, в подклассе UIView
. Вот как построить минимальный пример.
Создайте новый проект приложения на основе представления, назовите его ShakeTest
. Создайте новый подкласс UIView
, назовите его ShakeView
. Сделайте так, чтобы ShakeView.h
выглядел так:
#import <UIKit/UIKit.h>
@interface ShakeView : UIView {
}
@end
Сделайте ShakeView.m
следующим образом:
#import "ShakeView.h"
@implementation ShakeView
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if ( event.subtype == UIEventSubtypeMotionShake ) {
NSLog(@"Shake!");
}
if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) {
[super motionEnded:motion withEvent:event];
}
}
@end
Сделайте ShakeTestViewController.h
таким:
#import <UIKit/UIKit.h>
#include "ShakeView.h"
@interface ShakeTestViewController : UIViewController {
ShakeView *s;
}
@end
] Сделайте так, чтобы ShakeTestViewController.m
выглядел так:
#import "ShakeTestViewController.h"
@implementation ShakeTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
s = [[ShakeView alloc] init];
[[self view] addSubview:s];
[s becomeFirstResponder];
}
- (void)dealloc {
[s release];
[super dealloc];
}
@end
Выполните сборку и запустите. Нажмите Cmd-Ctrl-Z, чтобы встряхнуть симулятор iPhone.
У вас реализован старый метод
'acelerometer: didAccelerate'
? Если у вас реализован старый метод для всего приложения, вам необходимо удалить его, прежде чем будет вызван новый.