0

我有一個簡單的應用程序,它由2個視圖組成。頂視圖有一個加速度計代表。當用戶在頂部視圖在屏幕上時抖動。然後調用pushviewcontroller並顯示子視圖。問題是當子視圖出現時,我搖動它,它仍然捕捉搖動動作並導致我出錯。所以幫助我。提前致謝。在其他視圖捕捉動搖行動?

- (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]; 
} 

時調用play方法和視頻播放結束後,pushviewcontroller將被調用,副視點會出現

下面

是處理所有movieplayer東西類。

- (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

:是你應該的mPlayerPushed設置爲NO。

或者您可以使用屬性模式視圖控制器來查看是否顯示模態視圖。這我還沒有測試,但它應該工作。

modalViewController:控制器爲活動模態的視圖,也就是說, ,其上由 接收機管理的視圖的頂部暫時顯示的視圖。 (只讀)

@property(nonatomic, readonly) UIViewController *modalViewController 

,從而代替布爾mPlayerPushed你將有:

if(shake && something.modalviewController == nil){ present mMoviePlayer } 
+0

的評論好,謝謝。我只是添加了一些代碼。 – 2012-07-24 06:27:02

+0

如果這是真的,你應該測試modalViewController屬性是否等於你的mMoviePlayer,那麼你可以使用它,而不是像我最初的想法那樣聲明一個新變量。第一個解決方案應該按預期工作。 – 2012-07-24 06:42:52

+0

我改變了條件搖&& mMoviePlayer。所以子視圖不會抓住(或者是什麼)搖動動作。但是當子視圖出現緩存顯示在子視圖上。換句話說,我搖動它,然後我再次回到主菜單,然後我再次搖動它,這次子視圖立即向我展示了subivew的早期內容,然後將它改變爲正確的看法。這是什麼意思 ? – 2012-07-24 06:45:10