Comment créer un bouton "plus" lorsque l'utilisateur glisse une cellule en mode tableau (comme l'application de messagerie dans iOS 7)
J'ai cherché ces informations ici et sur le forum Cocoa Touch, mais je n'arrive pas à trouver la réponse et j'espère que quelqu'un plus intelligent que moi pourra me donner une solution.
J'aimerais que lorsque l'utilisateur glisse une cellule de vue de table, pour afficher plus d'un bouton d'édition (il est par défaut le bouton Supprimer). Dans l'application Mail pour iOS 7, vous pouvez glisser pour supprimer, mais il y a un bouton "PLUS" qui apparaît.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
la source
la source
Réponses:
Comment mettre en œuvre
Il semble que iOS 8 ouvre cette API. Des indices d'une telle fonctionnalité sont présents dans la version bêta 2.
Pour que quelque chose fonctionne, implémentez les deux méthodes suivantes sur le délégué de votre UITableView pour obtenir l'effet souhaité (voir gist pour un exemple).
Problèmes connus
La documentation indique que tableView: commitEditingStyle: forRowAtIndexPath est:
Cependant, le balayage ne fonctionne pas sans lui. Même si le stub de la méthode est vide, il en a toujours besoin, pour l'instant. Il s'agit bien évidemment d'un bug dans la bêta 2.
Sources
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Réponse originale: https://stackoverflow.com/a/24540538/870028
Mettre à jour:
Exemple de code avec ce fonctionnement (dans Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
L'exemple de code contient cette méthode facile à suivre dans MasterViewController.swift, et avec juste cette méthode, vous obtenez le comportement indiqué dans la capture d'écran OP:
la source
tableView.editing = false
(NO
en objc) et la cellule "se fermera".J'ai créé une nouvelle bibliothèque pour implémenter des boutons swippables qui prennent en charge une variété de transitions et de boutons extensibles comme l'application de messagerie iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Cette bibliothèque est compatible avec toutes les différentes façons de créer un UITableViewCell et son testé sur iOS 5, iOS 6, iOS 7 et iOS 8.
Voici un échantillon de quelques transitions:
Transition frontalière:
Transition de clip
Transition 3D:
la source
La réponse de Johnny est la bonne à voter. J'ajoute juste ceci ci-dessous dans objective-c pour le rendre plus clair pour les débutants (et ceux d'entre nous qui refusent d'apprendre la syntaxe Swift :)
Assurez-vous de déclarer uitableviewdelegate et disposez des méthodes suivantes:
la source
Il s'agit (plutôt ridiculement) d'une API privée.
Les deux méthodes suivantes sont privées et envoyées au délégué de UITableView:
Ils sont assez explicites.
la source
Pour améliorer la réponse de Johnny, cela peut maintenant être fait en utilisant l'API publique comme suit:
la source
J'espère que vous ne pouvez pas attendre que Apple vous donne ce dont vous avez besoin, non? Voici donc mon option.
Créez une cellule personnalisée. Avoir deux uiviews dedans
Dans la vue inférieure, ajoutez les boutons dont vous avez besoin. Traitez ses actions comme n'importe quelle autre IBActions. vous pouvez décider de la durée de l'animation, du style et de tout.
ajoutez maintenant une uiswipegesture à la vue supérieure et révélez votre vue inférieure sur le geste de balayage. Je l'ai déjà fait auparavant et c'est l'option la plus simple en ce qui me concerne.
J'espère que cette aide.
la source
Cela n'est pas possible avec le SDK standard. Cependant, il existe différentes solutions tierces qui imitent plus ou moins le comportement dans Mail.app. Certains d'entre eux (par exemple MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) détectent les balayages à l'aide de reconnaissance de gestes, certains d'entre eux (par exemple SWTableViewCell ) placent un deuxième UISScrollView en dessous de la norme
UITableViewCellScrollView
(sous-vue privée deUITableViewCell
) et certains d'entre eux modifient le comportement deUITableViewCellScrollView
.J'aime la dernière approche, car la manipulation tactile est la plus naturelle. Plus précisément, MSCMoreOptionTableViewCell est bon. Votre choix peut varier en fonction de vos besoins spécifiques (si vous avez également besoin d'un panoramique de gauche à droite, si vous avez besoin de la compatibilité iOS 6, etc.). Sachez également que la plupart de ces approches sont lourdes: elles peuvent facilement s'introduire dans une future version iOS si Apple apporte des modifications dans la
UITableViewCell
hiérarchie des sous- vues.la source
Code de version Swift 3 sans utiliser de bibliothèque:
la source
Vous devez sous
UITableViewCell
-willTransitionToState:(UITableViewCellStateMask)state
classer et la méthode de sous -classe qui est appelée chaque fois que l'utilisateur glisse la cellule. lestate
drapeaux vous indiqueront si le bouton Supprimer s'affiche et afficheront / masqueront votre bouton Plus.Malheureusement, cette méthode ne vous donne ni la largeur du bouton Supprimer ni la durée de l'animation. Vous devez donc observer et coder en dur le temps de trame et d'animation de votre bouton Plus dans votre code (je pense personnellement qu'Apple doit faire quelque chose).
la source
Pour une programmation rapide
la source
CELA POURRAIT VOUS AIDER.
la source
Je cherchais à ajouter la même fonctionnalité à mon application, et après avoir parcouru tant de didacticiels différents ( raywenderlich étant la meilleure solution de bricolage), j'ai découvert qu'Apple avait sa propre
UITableViewRowAction
classe, ce qui est très pratique.Vous devez changer la méthode de point de chaudière de Tableview en ceci:
Vous pouvez en savoir plus sur ce site . La propre documentation d' Apple est vraiment utile pour changer la couleur d'arrière-plan:
Si vous voulez changer la police du bouton, c'est un peu plus délicat. J'ai vu un autre post sur SO. Pour fournir le code ainsi que le lien, voici le code qu'ils ont utilisé là-bas. Vous devez changer l'apparence du bouton. Vous devriez faire une référence spécifique à tableviewcell, sinon vous changeriez l'apparence du bouton dans votre application (je ne le voulais pas, mais vous pourriez, je ne sais pas :))
Objectif c:
Rapide:
Ceci est la version IMHO la plus simple et la plus rationalisée. J'espère que ça aide.
Mise à jour: voici la version Swift 3.0:
la source
shareMenu.
ne prend pas deaddAction
méthode. MerciActual Swift 3 Answer
C'est la SEULE fonction dont vous avez besoin. Vous n'avez pas besoin des fonctions CanEdit ou CommitEditingStyle pour les actions personnalisées.
la source
Depuis iOS 11, cela est accessible au public dans
UITableViewDelegate
. Voici un exemple de code:Aussi disponible:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Documents: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
la source
Swift 4 et iOs 11+
la source
J'ai utilisé tableViewCell pour afficher plusieurs données, après avoir glissé () de droite à gauche sur une cellule, il affichera deux boutons Approuver et rejeter, il existe deux méthodes, la première est ApproveFunc qui prend un argument et l'autre est RejectFunc qui a également prend un argument.
la source
Voici une façon quelque peu fragile de le faire qui n'implique pas d'API privées ni de construction de votre propre système. Vous couvrez vos paris qu'Apple ne casse pas et que, espérons-le, ils publieront une API avec laquelle vous pourrez remplacer ces quelques lignes de code.
Cela nécessite également que vous implémentiez les rappels de délégué d'édition de vue de table standard.
la source
Il existe une bibliothèque étonnante appelée
SwipeCellKit
, elle devrait gagner en reconnaissance. À mon avis, il fait plus frais queMGSwipeTableCell
. Ce dernier ne reproduit pas complètement le comportement des cellules de l'application Mail alors qu'il leSwipeCellKit
fait. Regardela source
SwipeCellKit
et j'ai été impressionné ... jusqu'à ce que j'obtienne l'une de ces exceptions, car le nombre de lignes avant une mise à jour de la vue de table n'était pas le même qu'après la mise à jour +/- le changement de lignes. Le fait est que je n'ai jamais changé mon jeu de données. Donc, si ce n'est pas inquiétant, je ne sais pas ce que c'est. J'ai donc décidé de ne pas l'utiliser et j'ai simplement utilisé les nouvelles méthodes UITableViewDelegate. Si vous avez besoin de plus de personnalisation, vous pouvez toujours passer outrewillBeginEditingRowAt: ....
Swift 4
la source
sourceView
est "La vue dans laquelle l'action a été affichée." Pour plus d'informations, recherchez «UIContextualAction.Handler».Voici une solution simple. Il est capable d'afficher et de masquer UIView personnalisé dans UITableViewCell. La logique d'affichage est contenue dans une classe étendue à partir de UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Pour obtenir cette fonctionnalité, étendez simplement votre cellule de vue de table à partir de BaseTableViewCell.
Ensuite, Inside UIViewController, qui implémente UITableViewDelegate, crée deux reconnaisseurs de gestes pour gérer les balayages gauche et droit.
Ensuite, ajoutez deux gestionnaires de balayage
Maintenant, à l'intérieur de cellForRowAtIndexPath, de UITableViewDelegate, vous pouvez créer une UIView personnalisée et l'attacher à la cellule retirée de la file d'attente.
Bien sûr, cette façon de charger UIView personnalisé est juste pour cet exemple. Gérez-le comme vous le souhaitez.
la source