web-dev-qa-db-fra.com

UIButton avec action de maintien et d'action de libération

Je veux créer un UIButton qui peut être maintenu enfoncé, quand il est enfoncé, il appelle l'action "hold down" une fois ... .. quand il est relâché, appelle l'action "hold was release".

Ce code ne fonctionne pas correctement car le contact peut bouger à l'intérieur du bouton et les événements ne sont pas déclenchés dans le bon ordre.

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

le traitement des événements de contrôle est basé sur l'implémentation de blocs UIBUtton +

14
Avner Barr

essaye ça

  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");

  }

dans le cas de NSPratik: u peut utiliser l'événement UIControlEventTouchUpOutside Si l'utilisateur appuie longuement sur le bouton, et après un certain temps, au lieu de relâcher le doigt, l'utilisateur déplacera son doigt en dehors du bouton. ajoutez juste un événement de plus.

  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 rapide

 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(aButton)

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

 func holdRelease(sender:UIButton)
 {
    print("hold release")
 }
44
Shankar BS

Essaye ça

Ajouter un événement TouchDown, Touch Up Inside, Touch Up Outside au bouton ur  

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
 }
7
Kalpesh

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

// Cet événement fonctionne bien et se déclenche

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

// Cela ne tire pas du tout 

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

Solution:-  

Utilisez la reconnaissance gestuelle à pression longue: - 

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

Mise en oeuvre 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];
}
}
7
Ashish
    **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
 }
1
Jaydip

Vous devez connecter les deux événements suivants: 1.Touch Down, 2.Touch Up to, c'est IBAction Methods. Mais vous pouvez aussi le faire par programme en utilisant addTarget: action: forControlEvents: 

0
Amulya

faites glisser un bouton dans la liste des outils (volet) et cliquez dessus avec le bouton droit de la souris. Une liste apparaîtra, recherchez "retouche à l'intérieur", cliquez et faites glisser le point circulaire qui se trouve devant le texte et déplacez-le vers viewcontroller.h et définissez un nom et dans viewcontroller. .m faire ceci.

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

0
user2408194