Два метода действия для UIButton;следующий трек и искать вперед: - PullRequest
1 голос
/ 18 декабря 2009

Я создаю приложение для музыкального плеера, и для этого нужно, чтобы с одной кнопки вызывалось 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;
}

Ответы [ 2 ]

4 голосов
/ 18 декабря 2009

Лично я бы просто отслеживал состояние кнопки с помощью целого числа на вашем контроллере представления или в подклассе кнопки. Если вы отслеживаете, что делает кнопка, вы можете контролировать, что делает каждое из действий. В вашем .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. Я не проверял это, но оно должно работать.

0 голосов
/ 18 декабря 2009

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

...