tToastKit / Documentación

SWIFTUI · CÓDIGO ABIERTO

Avisos que
se sienten propios.

Añade notificaciones toast apiladas y cuidadas a tu app SwiftUI. Los gestos, los tiempos y el estilo ya están incluidos.

Empezar ↓iOS 17+ · Swift 5.10
01

LISTO EN UN MOMENTO

Primeros pasos

Añade ToastKit con Swift Package Manager y conecta un ToastCenter a la vista que deba mostrar las notificaciones.

ContentView.swiftSWIFT
import SwiftUI
import ToastKit

struct ContentView: View {
    @State private var toasts = ToastCenter()

    var body: some View {
        Button("Guardar") {
            toasts.present(.normal, title: "Cambios guardados")
        }
        .toasts(toasts)
    }
}
✳

Y listo. El aviso aparece cuatro segundos en la parte inferior del área segura. Las acciones de deslizamiento predeterminadas permiten eliminarlo o dejarlo para más tarde.

En Xcode, elige File → Add Package Dependencies e introduce https://github.com/DavidRicardoWilde/swiftui-toastkit.

02

EL MENSAJE

Mensajes toast

ToastMessage reúne el contenido, el estado semántico, la duración y las acciones opcionales de toque y deslizamiento. Usa el método rápido para avisos sencillos o crea el mensaje directamente si necesitas más control.

toasts.present(.warning,
    title: "Poco espacio",
    message: "Libera espacio para continuar la sincronización."
)

let message = ToastMessage(
    status: .notification,
    title: "Fotos nuevas",
    message: "12 fotos de hoy",
    icon: .system("photo.on.rectangle"),
    duration: 6
)
toasts.present(message)
NORMAL

Normal

Confirmaciones cotidianas con un tono discreto.

WARNING

Atención

Invita a revisar algo antes de que falle.

ERROR

Algo falló

Comunica los errores con una señal visual clara.

NOTIFICATION

Notificación

Usa el color de énfasis de tu app.

Si vuelves a presentar un mensaje con un id que ya está visible, se actualiza y pasa al frente. Es útil para mostrar estados como «Sincronizando…» y después «Sincronizado».

03

UN MOMENTO

Duración

.automatic usa la duración predeterminada del centro: cuatro segundos. Indica los segundos directamente o usa .indefinite si la persona debe responder.

// Se muestra dos segundos
ToastMessage(title: "Copiado", duration: 2)

// Permanece hasta que se cierre
ToastMessage(title: "Error al sincronizar", duration: .indefinite)

let toasts = ToastCenter(defaultDuration: 6)
  • Solo cuenta el aviso que está delante.
  • Los avisos cubiertos conservan todo su tiempo hasta pasar al frente.
  • El temporizador se pausa mientras alguien toca la pila o la app está en segundo plano.
04

UN SIGUIENTE PASO CLARO

Gestos y acciones

Se puede tocar, deslizar en cualquier dirección o mantener pulsado para ver ambas opciones antes de elegir. VoiceOver también ofrece las acciones por nombre.

GestoPredeterminadoPersonaliza con
ToqueSin acción; pasa al contenido de atrástapAction u onTap
Deslizar hacia leadingEliminar el avisoswipeActions.leading
Deslizar hacia trailingMostrarlo en la próxima visitaswipeActions.trailing
Mantener pulsadoPrevisualizar ambas accionesUsa las mismas acciones
let archive = ToastAction(
    id: "archive",
    title: "Archivar",
    icon: .system("archivebox"),
    confirmation: "Archivado"
) { toast in
    store.archive(toast.id)
}

toasts.present(ToastMessage(
    title: "Mensaje de Ana",
    tapAction: ToastAction(title: "Abrir") { toast in
        router.open(toast.id)
    },
    swipeActions: ToastSwipeActions(leading: archive, trailing: .later)
))

Las acciones se ejecutan en este orden: su handler, el observador onToastAction de la pila y, por último, su efecto. La acción integrada .later guarda el aviso hasta que la página vuelva a aparecer.

05

A TU MANERA

Estilos y temas

El estilo predeterminado .glass dibuja una tarjeta translúcida teñida según el estado. Ajusta los tokens con ToastTheme, elige .plain o implementa ToastStyle para crear una tarjeta propia.

MyScreen()
    .toasts(toasts)
    .toastTheme(ToastTheme(
        titleFont: .headline,
        tint: { status in
            status == .notification ? .pink : ToastTheme.standardTint(status)
        },
        cornerRadius: 16
    ))

// Empieza sin superficie ni colores fijos
MyScreen().toasts(toasts).toastStyle(.plain)
Movimiento Color Superficie Tipografía

Un estilo propio recibe el icono, el título, el mensaje, el estado y la información de si la tarjeta está elevada sobre la pista. La pila sigue controlando el diseño y los gestos.

06

EN EL LUGAR ADECUADO

Posición y ancho

De forma predeterminada, las tarjetas se apilan desde abajo y ocupan el 60% del área segura disponible.

// Anclar arriba
MyScreen().toasts(toasts, placement: .top)

// El 90% del área segura o un ancho fijo
MyScreen().toasts(toasts, width: .fraction(0.9))
MyScreen().toasts(toasts, width: .points(320))

Dentro de un TabView, aplica .toasts(toasts) al contenido de la pestaña. Las barras del sistema ya forman parte del área segura. Marca una barra flotante personalizada con .toastObstruction() para que la pila deje espacio.

✓Guardadoabajo · 60%
ÁREA SEGURA
07

PARA TODAS LAS PERSONAS

Accesibilidad

Las acciones están disponibles sin depender de un gesto y respetan los ajustes de accesibilidad del entorno SwiftUI.

  • VoiceOver lee cada tarjeta y ofrece ambas acciones en el rotor.
  • Reducir movimiento sustituye los deslizamientos por fundidos.
  • Reducir transparencia vuelve opacas las superficies de cristal.
  • Aumentar contraste refuerza el borde de la tarjeta.
  • Dynamic Type escala el texto y el icono de estado.
08

EN SU IDIOMA

Localización de la app

Las etiquetas integradas de ToastKit están disponibles en inglés, japonés, chino simplificado y chino tradicional. Localiza en tu app los títulos, mensajes y etiquetas personalizadas.

// Guarda el texto de la app en un String Catalog o Localizable.strings.
toasts.present(.warning,
    title: String(localized: "storage.low.title"),
    message: String(localized: "storage.low.message")
)

ToastKit muestra sus etiquetas integradas según la configuración regional de la app anfitriona. Los títulos y confirmaciones de ToastAction son cadenas normales y se localizan con las mismas herramientas de la app.

SIGUE EXPLORANDO

¿Le damos un último toque?

Consulta el código fuente y los ejemplos completos de la API.

Ver en GitHub ↗