Встряхнуть действия поймали в других взглядах?
У меня есть простое приложение, которое состоит из 2 просмотров. Вид сверху имеет акселерометр делегатов. когда пользователь трясется, когда на экране вид сверху. тогда вызывается pushviewcontroller и появляется subview. проблема в том, что когда появляется подпредставление, я встряхиваю его, оно все равно ловит дрожание и выдает ошибку. Так что помоги мне. заранее спасибо.
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
const float violence = 1.2;
static BOOL beenhere;
BOOL shake = FALSE;
if (beenhere) return;
beenhere = TRUE;
if (acceleration.x > violence || acceleration.x < (-1* violence))
shake = TRUE;
if (acceleration.y > violence || acceleration.y < (-1* violence))
shake = TRUE;
if (acceleration.z > violence || acceleration.z < (-1* violence))
shake = TRUE;
if (shake) {
[self playSound:@"suzu"];
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"noVib"] == NO) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
[[UIAccelerometer sharedAccelerometer] setDelegate:nil];
[self presentModalViewController:mMoviePlayer animated:YES];
[self play];
}
Когда вызывается метод воспроизведения и видео завершается, вызывается pushviewcontroller и появляется вспомогательный вид.
ниже приведен класс, который обрабатывает все, что нужно кинематографисту.
- (void) initPlayer{
if (mMoviePlayer != nil){
[mMoviePlayer release];
}
mMoviePlayer = [[MoviePlayerViewController alloc] initWithContentURL:[self createURL]];
[[NSNotificationCenter defaultCenter] removeObserver:mMoviePlayer
name:MPMoviePlayerPlaybackDidFinishNotification object:mMoviePlayer.moviePlayer];
[mMoviePlayer.moviePlayer setShouldAutoplay:NO];
mMoviePlayer.moviePlayer.backgroundView.backgroundColor = [UIColor blackColor];
mMoviePlayer.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
mMoviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:mMoviePlayer.moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerLoadStateDidChangeNotification
object:mMoviePlayer.moviePlayer];
- (void) moviePlayBackDidFinish:(NSNotification*)notification
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:mMoviePlayer.moviePlayer];
[self dismissModalViewControllerAnimated:YES];
[mMoviePlayer release];
mMoviePlayer = nil;
[self toNext];
}
1 ответ
Первое, что приходит мне в голову, - это следить за тем, нажата ли mMoviePlayer или нет.
if (shake && mPlayerPushed) {
[self playSound:@"suzu"];
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"noVib"] == NO) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
[[UIAccelerometer sharedAccelerometer] setDelegate:nil];
[self presentModalViewController:mMoviePlayer animated:YES];
[self play];
mPlayerPushed = YES;
}
в методе moviePlayBackDidFinish после вызова dismissModalViewControllerAnimated:YES вы должны установить mPlayerPressed в значение NO.
или вы можете использовать свойство modal view controller, чтобы увидеть, отображается ли модальное представление. Это я еще не проверял, но это должно работать.
modalViewController: контроллер для активного модального представления, то есть представление, которое временно отображается поверх представления, управляемого получателем. (Только для чтения)
@property(nonatomic, readonly) UIViewController *modalViewController
поэтому вместо bool mPlayerPressed у вас будет:
if(shake && something.modalviewController == nil){ present mMoviePlayer }