Cómo crear un botón "más" cuando el usuario desliza una celda en la vista de tabla (como la aplicación de correo en ios 7)
He estado buscando esta información aquí y en el foro de Cocoa Touch, pero parece que no puedo encontrar la respuesta y espero que alguien más inteligente que yo pueda darme una solución.
Me gustaría que cuando el usuario deslice una celda de vista de tabla, muestre más de un botón de edición (el predeterminado es el botón Eliminar). En la aplicación Correo para iOS 7, puede deslizar para eliminar, pero aparece un botón "MÁS".
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
fuente
fuente
Respuestas:
Cómo implementar
Parece que iOS 8 abre esta API. Hay indicios de dicha funcionalidad en Beta 2.
Para que algo funcione, implemente los siguientes dos métodos en el delegado de su UITableView para obtener el efecto deseado (vea la esencia para un ejemplo).
Problemas conocidos
La documentación dice tableView: commitEditingStyle: forRowAtIndexPath es:
Sin embargo, el deslizamiento no funciona sin él. Incluso si el código auxiliar del método está en blanco, todavía lo necesita, por ahora. Esto es obviamente un error en beta 2.
Fuentes
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Respuesta original: https://stackoverflow.com/a/24540538/870028
Actualizar:
Código de muestra con este funcionamiento (en Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
El código de muestra contiene este método fácil de seguir en MasterViewController.swift, y solo con este método obtienes el comportamiento que se muestra en la captura de pantalla de OP:
fuente
tableView.editing = false
(NO
en objc) y la celda se "cerrará".He creado una nueva biblioteca para implementar botones intercambiables que admite una variedad de transiciones y botones expandibles como la aplicación de correo iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Esta biblioteca es compatible con todas las diferentes formas de crear un UITableViewCell y se ha probado en iOS 5, iOS 6, iOS 7 e iOS 8.
Aquí una muestra de algunas transiciones:
Transición fronteriza:
Transición de clip
Transición 3D:
fuente
La respuesta de Johnny es la correcta para votar. Solo estoy agregando esto a continuación en el objetivo-c para que sea más claro para los principiantes (y aquellos de nosotros que se niegan a aprender la sintaxis de Swift :)
Asegúrese de declarar el uitableviewdelegate y tenga los siguientes métodos:
fuente
Esta es (bastante ridícula) una API privada.
Los siguientes dos métodos son privados y se envían al delegado de UITableView:
Son bastante explicativos.
fuente
Para mejorar la respuesta de Johnny, esto ahora se puede hacer usando la API pública de la siguiente manera:
fuente
Espero que no puedas esperar hasta que Apple te dé lo que necesitas, ¿verdad? Así que aquí está mi opción.
Crea una celda personalizada. Tener dos uiviews en el
En la vista inferior, agregue los botones que necesite. Maneje sus acciones como cualquier otra IBActions. Puedes decidir el tiempo de animación, el estilo y cualquier cosa.
ahora agregue una uiswipegesture a la vista superior y revele su vista inferior en el gesto de deslizar. He hecho esto antes y es la opción más simple en lo que a mí respecta.
Espero que te sirva de ayuda.
fuente
Esto no es posible con el SDK estándar. Sin embargo, hay varias soluciones de terceros que imitan más o menos el comportamiento en Mail.app. Algunos de ellos (por ejemplo , MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) detectan deslizamientos utilizando reconocedores de gestos, algunos de ellos (por ejemplo, SWTableViewCell ) colocan un segundo UISScrollView por debajo del estándar
UITableViewCellScrollView
(subvista privada deUITableViewCell
) y algunos modifican el comportamiento deUITableViewCellScrollView
.Me gusta más el último enfoque ya que el manejo táctil se siente más natural. Específicamente, MSCMoreOptionTableViewCell es bueno. Su elección puede variar según sus necesidades específicas (si necesita una panorámica de izquierda a derecha, si necesita compatibilidad con iOS 6, etc.). También tenga en cuenta que la mayoría de estos enfoques conllevan una carga: pueden romperse fácilmente en una futura versión de iOS si Apple realiza cambios en la
UITableViewCell
jerarquía de subvista.fuente
Código de versión de Swift 3 sin usar ninguna biblioteca:
fuente
Necesita subclase
UITableViewCell
y método de subclasewillTransitionToState:(UITableViewCellStateMask)state
que se llama cada vez que el usuario desliza la celda. Lasstate
banderas le permitirán saber si se muestra el botón Eliminar y mostrar / ocultar su botón Más allí.Lamentablemente, este método no le proporciona el ancho del botón Eliminar ni el tiempo de animación. Por lo tanto, debe observar y codificar el marco y el tiempo de animación de su botón Más en su código (personalmente creo que Apple necesita hacer algo al respecto).
fuente
Para una programación rápida
fuente
ESTO PODRÍA AYUDARTE.
fuente
Estaba buscando agregar la misma funcionalidad a mi aplicación, y después de leer tantos tutoriales diferentes ( raywenderlich es la mejor solución de bricolaje), descubrí que Apple tiene su propia
UITableViewRowAction
clase, lo cual es muy útil.Debe cambiar el método boilerpoint de Tableview a esto:
Puede encontrar más información sobre esto en este sitio . La documentación de Apple es realmente útil para cambiar el color de fondo:
Si desea cambiar la fuente del botón, es un poco más complicado. He visto otra entrada en SO. En aras de proporcionar el código y el enlace, aquí está el código que usaron allí. Tendría que cambiar la apariencia del botón. Tendría que hacer una referencia específica a tableviewcell, de lo contrario cambiaría la apariencia del botón en toda su aplicación (no quería eso, pero es posible que no lo sepa :))
C objetivo:
Rápido:
Esta es la versión más fácil y más optimizada en mi humilde opinión. Espero eso ayude.
Actualización: Aquí está la versión Swift 3.0:
fuente
shareMenu.
No toma unaddAction
método. GraciasRespuesta real de Swift 3
Esta es la ÚNICA función que necesita. No necesita las funciones CanEdit o CommitEditingStyle para acciones personalizadas.
fuente
A partir de iOS 11, esto está disponible públicamente en
UITableViewDelegate
. Aquí hay un código de muestra:También disponible:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Documentos: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
fuente
Swift 4 y iOs 11+
fuente
Solía tableViewCell para mostrar los datos múltiple, después de golpe () de derecha a izquierda en una celda se mostrará dos botones Aprobar y rechazan, hay dos métodos, el primero es ApproveFunc que toma un argumento, y el otro es RejectFunc que también toma un argumento
fuente
Aquí hay una forma algo frágil de hacerlo que no involucra API privadas o la construcción de su propio sistema. Estás cubriendo tus apuestas para que Apple no rompa esto y esperemos que publiquen una API con la que puedas reemplazar estas pocas líneas de código.
Esto también requiere que implemente las devoluciones de llamada delegadas de edición de vista de tabla estándar.
fuente
Hay una biblioteca increíble llamada
SwipeCellKit
, debería ganar más reconocimiento. En mi opinión, es más genial queMGSwipeTableCell
. Este último no replica completamente el comportamiento de las celdas de la aplicación de correo, mientras queSwipeCellKit
sí lo hace. Echar un vistazofuente
SwipeCellKit
y me impresionó ... hasta que obtuve una de esas Excepciones porque el número de filas antes de una actualización de vista de tabla no era el mismo que después de la actualización +/- el cambio en las filas. La cuestión es que nunca cambié mi conjunto de datos. Entonces, si eso no es preocupante, no sé qué es. Así que decidí no usarlo y simplemente usé los nuevos métodos UITableViewDelegate. Si necesita más personalización, siempre se puede anularwillBeginEditingRowAt: ....
Swift 4
fuente
sourceView
es "La vista en la que se mostró la acción". Para obtener más información, busque "UIContextualAction.Handler".Aquí hay una solución simple. Es capaz de mostrar y ocultar UIView personalizado dentro de UITableViewCell. La lógica de visualización está contenida dentro de la clase extendida desde UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Para obtener esta funcionalidad, simplemente extienda su celda de vista de tabla desde BaseTableViewCell.
A continuación, Inside UIViewController, que implementa UITableViewDelegate, crea dos reconocedores de gestos para manejar los deslizamientos izquierdo y derecho.
Luego, agregue dos controladores deslizantes
Ahora, dentro de cellForRowAtIndexPath, de UITableViewDelegate, puede crear UIView personalizado y adjuntarlo a la celda en desuso.
Por supuesto, esta forma de cargar UIView personalizada es solo para este ejemplo. Adminístralo como quieras.
fuente