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 +
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")
}
Essaye ça
Ajouter un événement TouchDown, Touch Up Inside, Touch Up Outside au bouton ur
-(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
}
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];
}
}
**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
}
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:
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