2011-03-03 4 views
0

J'essaie d'activer une section de mon code lorsque vous appuyez (et maintenez) sur un bouton uniquement. Lorsque le bouton est relâché, je veux que mon étiquette soit à nouveau invisible. Y a-t-il un moyen de le faire efficacement? J'ai un IBAction (le bouton), et un IBOutlet (A textfield), avec ce code défini pour l'action:Activation du code sur le bouton Appuyez et maintenez SEULEMENT

- (IBAction)toggleIt:(id)sender { 
    if ([myDescription isHidden]) { 
     [myDescription setHidden:NO]; 
    } else { 
     [myDescription setHidden:YES]; 
    } 
} 

Toute aide? (En ce qui concerne les mannequins)

Zach

Répondre

1

Je crains qu'il n'y ait aucun moyen de le faire dans IB sur le Mac, car il serait possible sur iOS:

UIKit et AppKit - bien que similaires à bien des égards - sont deux bêtes très différentes . Là où AppKit a un héritage qui remonte aux années 1990 (peut-être même à la fin des années 1980) qui se manifeste dans quelques endroits (je vous regarde, NSCell), UIKit a été conçu avec l'expérience de 20 ans au-dessus de AppKit.

Et tandis que vous pouvez facilement dire UIControl quand son action va être appelée (et peut avoir différentes actions pour différents événements), NSControl vous permet simplement de spécifier une seule action à envoyer.

Si vous ne voulez pas passer outre -[NSButtonCell stopTracking:at:inView:mouseIsUp:] ou -[NSButton mouseDown:] et -[NSButton mouseUp:], la meilleure façon que vous pouvez réaliser ce que vous voulez devrait être de régler le bouton pour envoyer son action en continu. Cela peut être OS dans IB (dans l'inspecteur "Attributs" sous la catégorie "Contrôle").

La prochaine chose serait de rendre votre soutenue couche description et réécrire votre méthode d'action de manière à ceci:

- (IBAction)toggleIt:(id)sender { 
    CALayer *descriptionLayer = [myDescription layer]; 
    [descriptionLayer setHidden:NO]; // (ab-)use implicit animation 
    [descriptionlayer performSelector:@selector(setHidden:) withObject:@"" afterDelay:.1]; 
} 

Comment ça marche:

Le -property « caché » de CALayer est animable et en tant que tel, le changer provoquera une animation implicite. Puisque l'objectif C est juste C, tout ce qui n'est pas 0x0 est interprété comme YES et c'est là où la troisième ligne frappe: La chaîne vide n'est clairement pas 0x0 donc peu de temps après que cette action soit retournée, la couche sera appelée à cacher. Mais comme les transitions CAT se produisent graduellement et peuvent être mises à jour à mi-parcours, cela n'affecte que la visibilité de la couche lorsque l'action n'est plus déclenchée - c'est-à-dire que le bouton n'est plus pressé.

0

Vous pouvez utiliser le UIControlEventTouchDown pour cacher votre étiquette, puis le montrer sur l'événement UIControlEventTouchUpInside.

-(IBAction)buttonHit { 
    [myDescription setHidden:NO]; 
} 

-(IBAction)buttonReleased { 
    [myDescription setHidden:YES]; 
} 
+0

Existe-t-il un moyen de le faire sans minuterie? Je ne vois pas pourquoi je voudrais retarder mon code - quand le bouton est enfoncé, masquer le champ de texte. Une fois libéré, montrez-le à nouveau. On dirait que ce serait facile et ne nécessite pas de minuterie? – Zakman411

+0

@ Zakman411: Je pense que j'ai mal lu votre question initiale. J'ai mis à jour ma réponse. – FreeAsInBeer

+0

Je vois - comment pourrais-je implémenter le boutonHit et buttonReleased dans Interface Builder? Je ne vois pas ce qu'il faut faire glisser sur chaque IBAction? – Zakman411

Questions connexes