встряхните действие, пойманное в других представлениях?

У меня есть простое приложение, состоящее из 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];

}


person Mungunbat Enkhbayar    schedule 24.07.2012    source источник


Ответы (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 после вызова rejectModalViewControllerAnimated:YES вы должны установить для mPlayerPushed значение NO.

или вы можете использовать контроллер модального представления свойств, чтобы увидеть, отображается ли модальное представление. Это я еще не тестировал, но он должен работать.

modalViewController: контроллер для активного модального представления, то есть представления, которое временно отображается поверх представления, управляемого получателем. (только для чтения)

@property(nonatomic, readonly) UIViewController *modalViewController

поэтому вместо логического mPlayerPushed у вас будет:

if(shake && something.modalviewController == nil){ present mMoviePlayer }
person Sorin Antohi    schedule 24.07.2012
comment
вы должны проверить, равно ли свойство modalViewController вашему mMoviePlayer, если это правда, то вы можете использовать его вместо объявления новой переменной, как в первоначальной идее, которая у меня была. Однако первое решение должно работать так, как ожидалось. - person Sorin Antohi; 24.07.2012
comment
я изменил условие, чтобы встряхнуть &&mMoviePlayer. Таким образом, подвид не улавливает (или что-то в этом роде??) действие встряхивания. но когда появляется подвид, кеш отображается в подвиде. Другими словами, я встряхиваю его, затем снова возвращаюсь в главное меню, затем снова встряхиваю его, на этот раз подвид мгновенно показал мне более раннее содержимое подвида, затем он быстро изменился на правильный вид. что это означает ? - person Mungunbat Enkhbayar; 24.07.2012
comment
я проверил self.modalviewController == mmovieplayer. но это не равно - person Mungunbat Enkhbayar; 24.07.2012
comment
условие if(shake && mMoviePlayer) не будет работать для вас, потому что, как я вижу, вы инициализируете mMoviePlayer до того, как это условие будет проверено. Таким образом, mMoviePlayer всегда будет отличаться от нуля, поэтому вы всегда будете вводить блок if. Попробуйте добавить новую логическую переменную, как в первом фрагменте кода, который я добавил. - person Sorin Antohi; 24.07.2012
comment
Хорошо, спасибо, Сорин Антохи, ваш код работает, но я не совсем понял, что вы имеете в виду. - person Mungunbat Enkhbayar; 24.07.2012
comment
не могли бы вы сказать мне, что толкнул киноплеер, чтобы сделать действие встряхивания? - person Mungunbat Enkhbayar; 24.07.2012
comment
это не имеет ничего общего с действием встряхивания. это просто проверка, чтобы не нажимать другой mMoviePlayer поверх существующего. Странно, однако, что UIAccelerometer по-прежнему вызывает методы делегата, хотя вы установили его равным нулю. может быть, вы снова установите его на себя в другой части ... после того, как mMoviePlayer будет нажат или что-то в этом роде ... - person Sorin Antohi; 24.07.2012