{"id":1309,"date":"2025-09-12T00:00:00","date_gmt":"2025-09-11T22:00:00","guid":{"rendered":"https:\/\/programaraciegas.net\/?p=1309"},"modified":"2025-11-19T10:33:18","modified_gmt":"2025-11-19T09:33:18","slug":"como-etiquetar-imagenes-y-componentes-visuales-con-swiftui","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=1309","title":{"rendered":"C\u00f3mo etiquetar im\u00e1genes y componentes visuales en iOS y MacOS con SwiftUI"},"content":{"rendered":"<p>El desarrollo de interfaces con SwiftUI ofrece muchas ventajas en simplicidad y expresividad, pero tambi\u00e9n implica una responsabilidad clara: garantizar que todos los componentes sean accesibles. En este sentido, el modificador accessibilityLabel juega un papel fundamental, ya que permite proporcionar descripciones comprensibles para los usuarios que navegan mediante VoiceOver u otros productos de apoyo.<\/p>\n<p>En una aplicaci\u00f3n m\u00f3vil, es habitual encontrar botones representados solo con iconos, im\u00e1genes decorativas o gr\u00e1ficos complejos que transmiten informaci\u00f3n de manera visual. Si estos elementos no cuentan con una etiqueta accesible, el lector de pantalla se limitar\u00e1 a leer su nombre interno por ejemplo, \u201cpaperplane.fill\u201d o incluso no los anunciar\u00e1, lo que genera una experiencia frustrante y excluyente.<\/p>\n<p>El modificador accessibilityLabel resuelve este problema al ofrecer un texto alternativo que describe la funci\u00f3n o el significado del elemento. La idea es que, al interactuar con el componente, VoiceOver verbalice la etiqueta definida en lugar del nombre interno o el contenido gr\u00e1fico.<\/p>\n<h2>Ejemplo b\u00e1sico<\/h2>\n<p>Un caso t\u00edpico es un bot\u00f3n con un icono de avi\u00f3n de papel para enviar un mensaje. Visualmente resulta evidente, pero sin una etiqueta accesible el usuario ciego no comprender\u00eda su prop\u00f3sito:<\/p>\n<pre>Button(action: {<br \/>\/\/ Acci\u00f3n para enviar<br \/>}) {<br \/>Image(systemName: \"paperplane.fill\")<br \/>.font(.largeTitle)<br \/>}<br \/>.accessibilityLabel(\"Enviar mensaje\")<\/pre>\n<p>Al a\u00f1adir .accessibilityLabel(\u00abEnviar mensaje\u00bb), VoiceOver anuncia esa frase, y la acci\u00f3n del bot\u00f3n se vuelve comprensible y usable para todas las personas.<\/p>\n<p>Adem\u00e1s, no s\u00f3lo se benefician los usuarios ciegos, tambi\u00e9n el sistema de <strong>Voice control<\/strong> para iOS y MacOS utilizar\u00e1 ese texto para localizar el bot\u00f3n y poderlo pulsar de forma m\u00e1s c\u00f3moda para el usuario.<\/p>\n<h2>M\u00e1s all\u00e1 de los iconos<\/h2>\n<p>El uso de accessibilityLabel no se limita a los botones. Tambi\u00e9n puede aplicarse a im\u00e1genes que transmiten informaci\u00f3n importante. Una fotograf\u00eda, un logotipo o un gr\u00e1fico que refuerce la identidad de una app deber\u00eda llevar una etiqueta adecuada.<\/p>\n<pre>Image(\"company_logo\")<br \/>.resizable()<br \/>.frame(width: 120, height: 120)<br \/>.accessibilityLabel(\"Logotipo de la empresa Ejemplo\")<\/pre>\n<p>En este caso, el lector de pantalla transmitir\u00e1 la descripci\u00f3n de la imagen en lugar de identificar un elemento inaccesible o verbalizar el nombre del fichero del logotipo de la empresa.<\/p>\n<h2>Buenas pr\u00e1cticas<\/h2>\n<p>La potencia de accessibilityLabel reside en su sencillez, pero eso no significa que se deba aplicarlo sin reflexi\u00f3n. Es importante tener en cuenta algunas recomendaciones:<\/p>\n<ol>\n<li>Claridad antes que detalle: las etiquetas deben ser breves y concretas. No conviene describir minuciosamente una imagen si con dos palabras es suficiente para transmitir la idea.<\/li>\n<li>Funci\u00f3n antes que forma: en un bot\u00f3n, es m\u00e1s importante describir la acci\u00f3n que detallar el icono. Por ejemplo, \u201cAbrir ajustes\u201d comunica m\u00e1s que \u201cEngranaje\u201d.<\/li>\n<li>Evitar redundancias: si un elemento ya tiene un texto visible, a\u00f1adir un accessibilityLabel id\u00e9ntico puede resultar repetitivo. En esos casos, lo mejor es dejar que VoiceOver lea directamente el texto.<\/li>\n<li>No etiquetar lo decorativo: si una imagen es meramente est\u00e9tica y no aporta informaci\u00f3n, lo correcto es marcarla como ignorada con .accessibilityHidden(true).<\/li>\n<\/ol>\n<p>Etiquetar im\u00e1genes y componentes visuales no es un a\u00f1adido opcional, sino un paso esencial para construir apps accesibles, usables y respetuosas con la diversidad de las personas que las utilizan. El modificador accessibilityLabel es un elemento sencillo y que ayuda a solucionar barreras severas de accesibilidad con un m\u00ednimo esfuerzo. Con unas pocas l\u00edneas de c\u00f3digo, es posible transformar una interfaz visual en una experiencia inclusiva, asegurando que todos los usuarios, independientemente de c\u00f3mo interact\u00faen con su dispositivo, comprendan y disfruten la aplicaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El desarrollo de interfaces con SwiftUI ofrece muchas ventajas en simplicidad y expresividad, pero tambi\u00e9n implica una responsabilidad clara: garantizar que todos los componentes sean accesibles. En este sentido, el modificador accessibilityLabel juega un papel fundamental, ya que permite proporcionar descripciones comprensibles para los usuarios que navegan mediante VoiceOver u otros productos de apoyo. En &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=1309\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abC\u00f3mo etiquetar im\u00e1genes y componentes visuales en iOS y MacOS con SwiftUI\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,42,38,6,258],"tags":[11,87,397],"class_list":["post-1309","post","type-post","status-publish","format-standard","hentry","category-desarrollo","category-ios","category-macos-x","category-programacion","category-swift","tag-accesibilidad-2","tag-programacion-2","tag-swiftui"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/1309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1309"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/1309\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}