Два метода действия для UIButton; следующий трек и искать вперед:

Я создаю приложение для музыкального проигрывателя, и ему нужно, чтобы 2 действия вызывались с помощью одной кнопки, одно для перехода к следующему треку путем касания внутри события, а другое для быстрой перемотки текущей дорожки в случае «длительного нажатия». Я не знаю, какое событие указывает на это долгое нажатие, я думал, что это касание, но это сработало только при удержании кнопки. Когда я отпустил кнопку, трек был пропущен к следующему элементу. пожалуйста, помогите

AVAudioPlayer *appSoundPlayer;// declared in .h file

В файле m метод:

-(void)seekForwards{
NSTimeInterval timex;
timex = appSoundPlayer.currentTime;
        timex = timex+5; // forward 5 secs

        appSoundPlayer.currentTime = timex;
        timex = 0;
}

person Nithin    schedule 18.12.2009    source источник


Ответы (2)


Лично я бы просто отслеживал состояние кнопки с целым числом на вашем контроллере представления или в подклассе кнопки. Если вы отслеживаете, что делает кнопка, вы можете контролировать, что делает каждое из действий. В вашем файле .h введите что-то вроде этого:

enum {
    MyButtonScanning,
    MyButtonStalling,
    MyButtonIdle
};



@interface YourClass : UIViewController {
    NSInteger buttonModeAt;
}
@property (nonatomic) NSInteger buttonModeAt;
-(IBAction)buttonPushedDown:(id)sender;
-(void)tryScanForward:(id)sender;
-(IBAction)buttonReleasedOutside:(id)sender;
-(IBAction)buttonReleasedInside:(id)sender;
@end

А затем в ваш файл .m добавьте что-нибудь из этого:

@implementation YourClass
///in your .m file
@synthesize buttonModeAt;


///link this to your button's touch down
-(IBAction)buttonPushedDown:(id)sender {
    buttonModeAt = MyButtonStalling;
    [self performSelector:@selector(tryScanForward:) withObject:nil afterDelay:1.0];
}

-(void)tryScanForward:(id)sender {
    if (buttonModeAt == MyButtonStalling) {
        ///the button was not released so let's start scanning
        buttonModeAt = MyButtonScanning;

        ////your actual scanning code or a call to it can go here
        [self startScanForward];
    }
}

////you will link this to the button's touch up outside
-(IBAction)buttonReleasedOutside:(id)sender {
    if (buttonModeAt == MyButtonScanning) {
        ///they released the button and stopped scanning forward
        [self stopScanForward];
    } else if (buttonModeAt == MyButtonStalling) {
        ///they released the button before the delay period finished
        ///but it was outside, so we do nothing
    }

    self.buttonModeAt = MyButtonIdle;
}

////you will link this to the button's touch up inside
-(IBAction)buttonReleasedInside:(id)sender {
    if (buttonModeAt == MyButtonScanning) {
        ///they released the button and stopped scanning forward
        [self stopScanForward];
    } else if (buttonModeAt == MyButtonStalling) {
        ///they released the button before the delay period finished so we skip forward
        [self skipForward];
    }

    self.buttonModeAt = MyButtonIdle;

}

После этого просто свяжите действия кнопки с тем, что я отметил в комментариях перед IBactions. Я не тестировал это, но это должно работать.

person mjdth    schedule 18.12.2009
comment
просто поместите это в класс и сделайте для него быструю кнопку, и все, кажется, работает нормально. Все, что вам нужно сделать, это добавить свои методы startScanForward, stopScanForward и skipForward. - person mjdth; 18.12.2009
comment
Спасибо за ответ. но пока никаких изменений, может быть проблема в методе startScanForward, я не знаю, что делать, чтобы перестать останавливаться. я добавляю метод startScanningForward к ma qn, я дал ему имя seekForwards:. - person Nithin; 18.12.2009
comment
Я создал простой uicontrolviewer с этими функциями, и он отлично работает. Это ответит на ваш вопрос о том, как заставить саму кнопку выполнять как пропуск, так и поиск на основе удержания. Вам нужны сами файлы? Или у вас проблемы с кодом сканирования/пропуска? - person mjdth; 18.12.2009
comment
Что он делает неправильно? ЕСЛИ он переходит к следующей песне после того, как вы отпустите кнопку, вы должны быть уверены, что полностью реализовали весь код, который я добавил выше. - person mjdth; 18.12.2009
comment
Вы видели метод, который я добавил к вопросу. это тот, который я использую вместо метода startScanForward, который вы указали. Но смущает метод «stopScanForward». не знаю, что в нем делать. :( - person Nithin; 18.12.2009
comment
это то, что я имел в виду. Методы startScanForward и skipForward выполняются успешно. но я не знаю, что делать с методом stopScanForward. Что делать внутри этого??? - person Nithin; 18.12.2009

вы можете создать подкласс класса вашей кнопки и немного поиграть с методами UIResponder. Например, в методе touchesBegan вы можете запустить некоторый таймер и вызвать метод, который переместит ваш файл и сделает недействительным этот таймер в методе toucesEnded.

person Morion    schedule 18.12.2009