versuche ich bekam von Two action methods for an UIButton; next track and seek forward:
ändern es nach Ihren Anforderungen.
Persönlich würde ich nur den Zustand der Schaltfläche mit einer Ganzzahl auf Ihrem View-Controller oder innerhalb einer Schaltfläche Unterklasse verfolgen. Wenn Sie verfolgen, was die Schaltfläche ausführt, können Sie steuern, was jede Aktion bewirkt. In Ihrer .h-Datei in ein paar Sachen so:
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
Und dann in .m Datei wirft in etwas über dieses Thema:
@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;
}
Danach verbinden nur die Aktionen der Taste zu dem, was ich habe in den Kommentaren vor den IBactions vermerkt. Ich habe das nicht getestet, aber es sollte funktionieren.
Nur eine Vermutung, eine BOOL machen und überprüfen sowohl in dem Verfahren und drehen Sie die Aktion durch: '- (void) removeTarget: action: ' –
Möchten Sie auch, dass das Umgekehrte passiert - das heißt, wenn touchDown ausgelöst wird, brauchen Sie dragInside nicht, wenn der Benutzer anfängt zu ziehen? Die einzige Möglichkeit, dies zu erreichen, besteht darin, am Anfang mit einer geringfügigen Verzögerung zu warten, um zu sehen, ob ein Ziehen beginnt. Wenn das nicht akzeptabel ist, dann müssen Sie mit einem anderen Design gehen. – rdelmar