【问题标题】:shake action catched in other views?摇动动作夹在其他视图中?
【发布时间】:2012-07-22 10:17:35
【问题描述】:

我有一个包含 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]; 
}

当调用播放方法且视频播放完毕后,将调用 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];

}

【问题讨论】:

    标签: iphone view uinavigationcontroller accelerometer pushviewcontroller


    【解决方案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;
    }
    

    在调用dismissModalViewControllerAnimated:YES 之后的moviePlayBackDidFinish 方法中,您应该将mPlayerPushed 设置为NO。

    或者您可以使用属性模态视图控制器来查看是否显示模态视图。这个我还没有测试过,但它应该可以工作。

    modalViewController:活动模式视图的控制器——也就是说, 临时显示在由管理的视图之上的视图 收件人。 (只读)

    @property(nonatomic, readonly) UIViewController *modalViewController
    

    所以你将拥有的不是 bool mPlayerPushed:

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

    【讨论】:

    • 你应该测试 modalViewController 属性是否等于你的 mMoviePlayer 如果这是真的,那么你可以使用它而不是像我最初的想法那样声明一个新变量。第一个解决方案应该可以按预期工作。
    • 我将条件更改为摇动 &&mMoviePlayer。所以子视图没有捕捉到(或什么??)摇动动作。但是当子视图出现时,缓存显示在子视图上。换句话说,我摇动它,然后我再次回到主菜单,然后我再次摇动它,这一次子视图立即向我显示了 subivew 的早期内容,然后它迅速变为正确的看法。这是什么意思?
    • 我检查了 self.modalviewController == mmovieplayer。但不等于
    • 条件 if(shake && mMoviePlayer) 对你不起作用,因为我看到你在检查该条件之前初始化 mMoviePlayer。所以 mMoviePlayer 总是与 nil 不同,所以你总是会进入 if 块。尝试添加一个新的 bool 变量,就像我添加的第一个代码 sn-p 一样。
    • 非常感谢 Sorin Antohi,你的代码被剪断了,我不明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多