私はこれを iPad と iPad シミュレーターの両方でテストしましたが、1 回のシェイクが成功した後は、motionBegan メソッドが呼び出されることはありません。以下は私のプログラムの抜粋です。
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if(event.type == UIEventSubtypeMotionShake)
{
NSLog(@"Shake event occurred.");
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Information" message:@"Some message here" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alert.tag = shakeTag;
[alert show];
}
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:NO];
[self becomeFirstResponder];
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:NO];
}
-(void)viewDidDisappear:(BOOL)animated {
[self resignFirstResponder];
[super viewDidDisappear:NO];
}
motionBegan メソッドが再び発生するのを妨げているのは正確には何ですか? UIAlertView を最初のシェイクで 1 回だけ表示し、その後のすべてのシェイクで却下したいと考えています。ファースト レスポンダーがまだ UIAlertView にアタッチされているため、motionBegan メソッドが再度呼び出されないようになっていると思います。
更新:私の対応する UIView には、作成された UIActionSheet があります。これは私のUIViewで呼び出されて実装されています)、UIActionSheetが画面に表示されると同時にmotionBeganメソッド(私のUIViewControllerにあります)をトリガーすると、motionBeganメソッドが呼び出せなくなるという問題が存在します。
その後、UIAlertView はどのボタン選択からも閉じられ、motionBegan メソッドは呼び出されなくなりますが、UIActionSheet は完全に正常に動作します。UIView には firstResponder の割り当てはなく、UIViewController には「canBecomeFirstResponder」のみが存在します。何か案は?