2013-10-07 4 views
13

Je veux créer un UIButton qui peut être maintenu enfoncé, lorsqu'il est maintenu enfoncé, il appelle une fois l'action «hold down». lorsqu'il est libéré, appelle l'action "hold was release".UIButton avec action de maintien et action de libération

Ce code ne fonctionne pas correctement parce que le contact peut se déplacer à l'intérieur du bouton et les événements ne sont pas déclenchés dans l'ordre correct

[button handleControlEvent:UIControlEventTouchDown withBlock:^{ 
     [self performMomentaryAction:PXActionTypeTouchDown]; 
    }]; 
[button handleControlEvent:UIControlEventTouchUpInside withBlock:^{ 
     [self performMomentaryAction:PXActionTypeTouchUp]; 
    }]; 

événements de contrôle de la poignée est basée sur la mise en œuvre du bloc UIButton +

Répondre

39

essayer cette

UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    aButton.frame = CGRectMake(xValue, yValue, 45, 45); 
    [aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown]; 
    [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside]; 


- (void)holdDown 
    { 
    NSLog(@"hold Down"); 
    } 

    - (void)holdRelease 
    { 
     NSLog(@"hold release"); 

    } 

pour le cas de NSPratik: u peut utiliser l'événement UIControlEventTouchUpOutside Si le bouton de presse à long utilisateur et après un certain temps, au lieu de libérer le doigt, l'utilisateur se déplace son/son doigt hors des limites du bouton. ajoutez juste un autre événement.

UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    aButton.frame = CGRectMake(xValue, yValue, 45, 45); 
    [aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown]; 
    [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside]; 
    [aButton addTarget:self action:@selector(holdReleaseOutSide) forControlEvents:UIControlEventTouchUpOutside]; //add this for your case releasing the finger out side of the button's frame 

//add this method along with other methods 
    - (void)holdReleaseOutSide 
    { 
    NSLog(@"hold release out side"); 
    } 

Version Swift

var aButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton 
    aButton.frame = CGRectMake(xValue,yValue, 45, 45) 
    aButton.setTitle("aButton", forState: UIControlState.Normal) 
    aButton.backgroundColor = UIColor.greenColor() 
    aButton.addTarget(self, action: Selector("holdRelease:"), forControlEvents: UIControlEvents.TouchUpInside); 
    aButton.addTarget(self, action: Selector("HoldDown:"), forControlEvents: UIControlEvents.TouchDown) 
    self.addSubview(testButton) 

    //target functions 
    func HoldDown(sender:UIButton) 
    { 
     println("hold down") 
    } 

    func holdRelease(sender:UIButton) 
    { 
     println("hold release") 
    } 
+0

Il travaille pour moi.Mais, il y a un scénario dans lequel cela ne fonctionnera pas. Si l'utilisateur appuie longuement sur le bouton et après un certain temps, au lieu de relâcher le doigt, l'utilisateur sortira son doigt hors des limites du bouton. Dans ce cas 'holdRelease' ne sera pas appelé ... – NSPratik

+1

@NSPratik j'ai modifié le code, pour votre cas, vérifiez-le –

+0

Merci Shan pour votre aide. Upvoted !!! – NSPratik

6

Essayez cette

Ajouter TouchDown, touch Up Inside, Retouchez événement extérieur ur bouton

enter image description here

-(IBAction)theTouchDown:(id)sender 
{ 

    timer = [NSTimer scheduledTimerWithTimeInterval:0.2 
              target:self 
              selector:@selector(performFunctionality) 
              userInfo:nil 
    } 
-(IBAction)theTouchUpInside:(id)sender 
{ 
[timer invalidate]; 
timer = nil; 
[self performFunctionality]; 

} 


-(IBAction)theTouchUpOutside:(id)sender 
{ 
[timer invalidate]; 
timer = nil; 
} 

-(void)performFunctionality 
{ 
//write your logic 
} 
0

glisser un bouton d'outils (volet) et un clic droit sur la liste it.â se produira trouver « toucher à l'intérieur », puis cliquez et faites glisser sur le point de cercle sur le devant du texte et déplacez-le vers viewcontroller.h et définissez un nom et dans viewcontroller.m.

nslog("clicked in"); répétition toutes les actions pour toucher et en trouver un événement approprié de la liste

0

Vous devez vous connecter après deux événements 1.Touch vers le bas, à l'intérieur 2.Touch lui est IBAction Méthodes .it être amusant dans Interface Builder. Mais vous pouvez le faire en utilisant également addTarget programme: action: forControlEvents:

6

J'ai fait face à ce problème moi-même, et surtout nous utilisons ces événements: -

// Cet événement fonctionne très bien et les incendies

[aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown]; 
//

Cela ne se déclenche pas du tout

[aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside]; 

Solution: -

utilisation à long presse Gesture Recognizer: -

UILongPressGestureRecognizer *btn_LongPress_gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleBtnLongPressgesture:)]; 
[aButton addGestureRecognizer:btn_LongPress_gesture]; 

mise en œuvre du geste: -

- (void)handleBtnLongPressgesture:(UILongPressGestureRecognizer *)recognizer{ 


//as you hold the button this would fire 

if (recognizer.state == UIGestureRecognizerStateBegan) { 

    [self holdDown]; 
} 

//as you release the button this would fire 

if (recognizer.state == UIGestureRecognizerStateEnded) { 

    [self holdRelease]; 
} 
} 
+0

Cette approche était la seule qui fonctionne à partir des mêmes réponses que j'ai trouvées sur stackoverflow (iOS 7.1., Xcode 5.1.). –

+0

Merci .. et super il a résolu votre problème – Ashish

1
**in Swift 3.0,** 

btnPasswordShow.addTarget(self, action:#selector(btnShowPasswordClickHoldDown), for: .touchDown) 

btnPasswordShow.addTarget(self, action:#selector(btnShowPasswordClickRelease), for: .touchUpInside) 

func btnShowPasswordClickHoldDown(){ 
    txtpassword.isSecureTextEntry = false 
} 

func btnShowPasswordClickRelease(){ 
    txtpassword.isSecureTextEntry = true 
} 
Questions connexes