2010-07-19 48 views
15

Bunu yapmanın çok kolay bir yolunu bulamadım. Gördüğüm yollar tüm bu zamanlayıcıları ve eşyaları gerektiriyor. Bir UIButton tutabilmem için kolay bir yol var mı ve serbest bırakılıncaya kadar eylemi tekrar etmesine neden oluyor mu?UIButton Dokun ve Tut

cevap

17

Aşağıdakileri yapabilirsiniz: Uygulama başladığında veya viewDidLoad uygulamasında başlatılacak ve aynı zamanda bir boole hazırlayacak bir NSTimer oluşturun. Örneğin

: En uygulama dosyasında Şimdi

//Declare the timer, boolean and the needed IBActions in interface. 
@interface className { 
NSTimer * timer; 
bool g; 
} 
-(IBAction)theTouchDown(id)sender; 
-(IBAction)theTouchUpInside(id)sender; 
-(IBAction)theTouchUpOutside(id)sender; 

//Give the timer properties. 
@property (nonatomic, retain) NSTimer * timer; 

(.m):

//Synthesize the timer 
@synthesize timer; 
//When your view loads initialize the timer and boolean. 
-(void)viewDidLoad { 
    g = false; 
    timer = [NSTimer scheduledTimerWithInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES]; 
} 

Şimdi bir IBAction yapmak "Touch Down" gerçek Diyelim için boole ayarlayın. Ardından "Touch Up Inside" ve "Touch Up Outside" için başka bir IBAction düğmesi yapın, boole öğesini false olarak atayın. Örneğin

: ... Bu herşeyi kolaylaştırır umut

-(void) targetmethod:(id)sender { 
    if (g == true) { 
     //This is for "Touch and Hold" 
    } 
    else { 
     //This is for the person is off the button. 
    } 
} 

I (g beyan ettiğiniz boolean olduğunu varsayalım):

-(IBAction)theTouchDown { 
    g = true; 
} 

-(IBAction)theTouchUpInside { 
    g = false; 
} 

-(IBAction)theTouchUpOutside { 
    g = false; 
} 

Sonra bu NSTimer yönteminde aşağıdaki koymak hala bir zamanlayıcı kullandığını biliyor ama başka bir yol yok.

+1

çok "hacky" ama mükemmel çalışıyor! –

+0

Zamanı ve mükemmelliği kaldırın – junaidsidhu

11

Maalesef, bu işlevselliği kendiniz için kodlamanız gerekiyor gibi görünüyor. basit yolu (Yine de bu bir zamanlayıcı gerekir):

Tekrarlamak istediğiniz eylemi gerçekleştiren bir fonksiyonu: .h dosyasını bir açıklamadan içinde

-(void) actionToRepeat:(NSTimer *)timer 
{ 
    NSLog(@"Action triggered"); 
} 

ve bir zamanlayıcı için bir mülk ayarlayın:

@interface ClassFoo 
{ 
    NSTimer* holdTimer; 
} 

Sonra .m yapmak iki IBActions:

-(IBAction) startAction: (id)sender 
{ 
    holdTimer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(actionToRepeat:) userInfo:nil repeats:YES]; 
    [holdTimer retain]; 
} 

-(IBAction) stopAction: (id)sender 
{ 
    [holdTimer invalidate]; 
    [holdTimer release]; 
    holdTimer = nil; 
} 

Sonra Hemenbağlantısı olan IB'deolayı, startAction ve Touch Up Inside "Stop Action" a getirildi. Tek bir astar değildir, ancak eylemin tekrarladığı hızı özelleştirmenize ve başka bir çıkış/eylemden tetiklemenize izin vermenize olanak tanır.

UIButton'u alt sınıflara ayırmayı ve bu işlevi sık sık kullanacaksanız bu işlevi eklemeyi düşünebilirsiniz - bu durumda ilk kez uygulamak yalnızca (hafif) acı verir.

+0

Geçersiz kılma zamanlayıcıyı kalıcı olarak kaldırır, değil mi? IPhone SDK referansından: geçersiz: Alıcının sürekli ateş etmesini durdurur ve çalışma döngüsünden kaldırılmasını ister. –

+0

Evet - bu gerekli işlev değil mi? Daha sonra – davbryn

1

Ben ilkine cevap, ancak bu hat olamaz: En az iOS 4.1 ve daha yeni ihtiyaçlar olmak için

timer = [NSTimer scheduledTimerWithInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES]; 

: this NBTouchAndHoldButton kullanmak

timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(targetMethod:) userInfo:nil repeats: YES]; 
9

bir başka yolu. Bu tam olarak ne istediğinizi ve onu uygulamak çok kolay:

TouchAndHoldButton * pageDownButton = [TouchAndHoldButton buttonWithType:UIButtonTypeCustom]; 
[pageDownButton addTarget:self action:@selector(pageDownAction:) forTouchAndHoldControlEventWithTimeInterval:0.2]; 

İyi şanslar!

+1

düğmesine bastığınızda yeni bir zamanlayıcı yaratılır, böylece başlıkların köprüleme başlığına aktarılması koşuluyla kimsenin bunu .swift denetleyicisine nasıl aktarması gerekir ??? –

+2

@GeorgeAsda Swift sürümü: https://github.com/vvit/TouchAndHoldButton – SoftDesigner

+1

Açık kaynak dünyasının nasıl geliştiğini öğrenmek için mutlu bir an ... – ingaham

0

Bunun eski bir soru olduğunu biliyorum, ancak kolay bir şekilde, "[NSObject performSelector: withObject: afterDelay:]" yöntemini kullanarak, belirli bir zaman aralığındaki yöntemleri tekrar tekrar çağırmak gibi. Bu durumda

:

NSTimeInterval someTimeInterval = 1; 

- (IBAction)action:(id)sender { 
    UIButton * const button = sender; 
    if (button.state != UIControlStateHighlighted) { 
     return; 
    } 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:_cmd object:sender]; 
    [self performSelector:_cmd withObject:sender afterDelay:someTimeInterval]; 
}