Aitor Sánchez - Blog - Oct. 28, 2023, 7:35 p.m.
¿Estás pensando en incluir una botonera con ion-segment en tu aplicación y no sabes cómo se hace? O, quizás, sí que sabes cómo agregarlo pero, tienes alguna duda con sus funciones o campos de clase ¿verdad?
Mi nombre es Aitor Sánchez, desarrollo apps desde 2014, y en este artículo aprenderás, de una manera sencilla y práctica, a utilizar los Segments de Ionic en tus aplicaciones móviles.
Pero antes de continuar, esta es la Flutter Mafia. Es mi newsletter donde aprenderás desarrollo de apps móviles, aso y monetización junto con otros genietes que ya están dentro. Y si te suscribes te regalo mi ebook "Duplica los ingreso de tus apps en 5 minutos" No es broma, quizás te interese.
Y ya, basta de presentaciones y comenzamos ¡Let´s go!
Digamos que son el típico conjunto de botones situados dentro de una fila horizontal que nos permiten seleccionar uno y quitar la selección del resto.
Suelen tener un estilo propio y ser muy similares a las tabs en lo que a funcionalidad y diseño se refiere.
Normalmente son usados para alternar entre vistas (cómo las tabs) dentro del propio contenido de la aplicación en lugar de en una toggle bar, por ejemplo.
Pero veamos una imagen, que vale más que mil palabras:
Esta es una pregunta que me suelen hacer, normalmente, cuando enseño a utilizar dicho componente. La respuesta es no de manera predeterminada.
Los ion-segment tienen un ancho fijo (normalmente el ancho de padre) que le permite al sistema definir cuáles será el ancho de los botones hijos. Al hacerlo, así el sistema asegura que cada uno de los botones del segment se mostrará sin necesidad de tener que hacer scroll.
Por otro lado, si el texto del botón es demasiado largo es posible que se corte. Para que esto no suceda, puedes probar a poner etiquetas más pequeñas o, cómo veremos en el siguiente párrafo, hacerlo scrollable.
Cómo dije en el primer párrafo del punto, no son desplazables de manera predeterminada, pero si que se pueden hacer desplazables de manera explícita. Dicho módulo tiene un campo booleano llamado "scrollable" que si lo seteamos en "true" nos permitirá hacer scroll donde el segmento de manera horizontal.
No obstante, si optas por la opción de hacer desplazable el segment, recuerda revisar bien los width de los botones, y si es posible, ponerlos fijos. Así te evitarás futuros problemas de visualización.
Cómo intuirás, el componente tiene una accesibilidad completa a los gestos, pero también soporta el uso del teclado ya sea para usarlo en plataforma web o en escritorio. La funcionalidad que se puede lograr con este dispositivo es completa al igual que con los gestos.
Las opciones que tenemos a nuestra disposición para la navegación con teclado son las siguientes:
Cómo era de esperar, y más en un componente cómo este, dispone de interfaces que nos permitirá conocer cuando un usuario ha realizado alguna acción con él.
Sería la interfaz que se va a encargar de traer la información del evento. Su código es el siguiente:
interface SegmentChangeEventDetail {
value?: string;
}
Ahora bien, esta no es necesaria, pero se puede utilizar para extender la información generada por el evento y conocer más información sobre él. Su código es el siguiente:
interface SegmentCustomEvent extends CustomEvent {
target: HTMLIonSegmentElement;
detail: SegmentChangeEventDetail;
}
Ahora pasemos a ver cómo, de una manera práctica y totalmente funcional, podemos utilizar dicho componente.
<!-- Segment por defecto -->
<ion-segment (ionChange)="segmentChanged($event)">
<ion-segment-button value="friends">
<ion-label>Amigos</ion-label>
</ion-segment-button>
<ion-segment-button value="enemies">
<ion-label>Enemigos</ion-label>
</ion-segment-button>
</ion-segment>
<!-- Segment deshabilitado -->
<ion-segment (ionChange)="segmentChanged($event)" disabled value="sunny">
<ion-segment-button value="sunny">
<ion-label>Soleado</ion-label>
</ion-segment-button>
<ion-segment-button value="rainy">
<ion-label>Lluvioso</ion-label>
</ion-segment-button>
</ion-segment>
<!-- Segment con anclas -->
<ion-segment (ionChange)="segmentChanged($event)">
<ion-segment-button value="dogs">
<ion-label>Perros</ion-label>
</ion-segment-button>
<ion-segment-button value="cats">
<ion-label>Gatos</ion-label>
</ion-segment-button>
</ion-segment>
<!-- Segment desplazable -->
<ion-segment scrollable value="heart">
<ion-segment-button value="home">
<ion-icon name="home"></ion-icon>
</ion-segment-button>
<ion-segment-button value="heart">
<ion-icon name="heart"></ion-icon>
</ion-segment-button>
<ion-segment-button value="pin">
<ion-icon name="pin"></ion-icon>
</ion-segment-button>
<ion-segment-button value="star">
<ion-icon name="star"></ion-icon>
</ion-segment-button>
<ion-segment-button value="call">
<ion-icon name="call"></ion-icon>
</ion-segment-button>
<ion-segment-button value="globe">
<ion-icon name="globe"></ion-icon>
</ion-segment-button>
<ion-segment-button value="basket">
<ion-icon name="basket"></ion-icon>
</ion-segment-button>
</ion-segment>
<!-- Segment con color secundario -->
<ion-segment (ionChange)="segmentChanged($event)" color="secondary">
<ion-segment-button value="standard">
<ion-label>Standard</ion-label>
</ion-segment-button>
<ion-segment-button value="hybrid">
<ion-label>Hybrid</ion-label>
</ion-segment-button>
<ion-segment-button value="sat">
<ion-label>Satellite</ion-label>
</ion-segment-button>
</ion-segment>
<!-- Segment en una barra de herramientas -->
<ion-toolbar>
<ion-segment (ionChange)="segmentChanged($event)">
<ion-segment-button value="camera">
<ion-icon name="camera"></ion-icon>
</ion-segment-button>
<ion-segment-button value="bookmark">
<ion-icon name="bookmark"></ion-icon>
</ion-segment-button>
</ion-segment>
</ion-toolbar>
<!-- Segment con selección por defecto -->
<ion-segment (ionChange)="segmentChanged($event)" value="javascript">
<ion-segment-button value="python">
<ion-label>Python</ion-label>
</ion-segment-button>
<ion-segment-button value="javascript">
<ion-label>Javascript</ion-label>
</ion-segment-button>
</ion-segment>
Cómo apreciarás, la construcción es muy sencilla. Basta con usar la etiqueta "ion-segment" para después incluir dentro todos los "ion-segment-button" que nosotros queramos.
Ahora veamos cómo sería el código TS que se comunica con nuestro código HTML:
import { Component } from '@angular/core';
@Component({
selector: 'segment-example',
templateUrl: 'segment-example.html',
styleUrls: ['./segment-example.css'],
})
export class SegmentExample {
segmentChanged(ev: any) {
console.log('Segmento cambiado', ev);
}
}
Cómo habrás podido ver en el html, el evento "segmentChanged" hace referencia al evento, llamado de la misma manera, de nuestro código TS. Que imprimirá "Segmento cambiado" en consola, más el evento en si mismo, cuando sea llamado.
Siguiendo con el tutorial, ahora vamos a ver los atributos que podemos asignar a la etiqueta "ion-segment" y que hace cada uno de ellos.
En este caso, ion-segment solo dispone de un evento y es el siguiente:
Dicho evento será llamado cuando la propiedad "value" cambie de valor.
Para que veamos un ejemplo de nuevo, este sería el código:
<ion-segment (ionChange)="segmentChanged($event)">
<ion-segment-button value="friends">
<ion-label>Friends</ion-label>
</ion-segment-button>
<ion-segment-button value="enemies">
<ion-label>Enemies</ion-label>
</ion-segment-button>
</ion-segment>
Entonces, al cambiar de botón, ya sea con el teclado o un gesto, el evento "ionChange" llamará al método "segmentChanged".
Al tratarse de un componente visual, cómo todos los que hemos visto en el curso, dispone de unas propiedades CSS que podemos cambiar a placer. En este caso solo tiene una y es la siguiente:
Pues cómo su nombre indica, nos permite cambiar el color de fondo de ion-segment.
Mira... la mejora del logo de tu aplicación hace que tu app tenga más descargas, y por extensión que genere más dinero. Basándonos en este hecho, hemos creado una herramienta para que puedas hacer esto, mejorar el logo de tu app. La herramienta es esta de aquí, y dentro tienes un video que lo explica todo. No te hago espoiler. Entra al enlace.
Sin nada más que agregar, me despido hasta el siguiente artículo. Hasta entonces ¡que te vaya bien!