
-
Profundiza en las herramientas de escritura
Con las herramientas de escritura, las personas pueden corregir, reescribir y transformar texto directamente dentro de tu app. Aprende técnicas avanzadas que te permitan personalizar las herramientas de escritura para tu app. Explora las opciones de formato y cómo funcionan con la edición de texto enriquecido. Si tienes un motor de texto personalizado, aprende a integrar sin problemas la experiencia completa de herramientas de escritura, permitiendo realizar ediciones directamente dentro de la vista de texto.
Capítulos
- 0:00 - Introducción
- 0:46 - Novedades
- 2:21 - Personalizar las vistas de texto nativo
- 4:00 - Formato de texto enriquecido
- 7:41 - Motores de texto personalizados
- 16:58 - Próximos pasos
Recursos
Videos relacionados
WWDC24
-
Buscar este video…
Hola, soy Dongyuan y te doy la bienvenida a “Dive deeper into Writing Tools”. Trabajo en la entrada de texto e internacionalización. El año pasado, presentamos Herramientas de Escritura y mostramos cómo integrarlas en tu app. Hoy exploraremos algunos temas más avanzados. Te mostraré las novedades en Herramientas de Escritura: personalizaciones en las vistas de texto nativo, el texto enriquecido y el motor de texto personalizado. Comencemos. Con Herramientas de Escritura, las personas pueden mejorar sus palabras al reescribir, revisar y resumir el texto dentro de sus vistas de texto. Este año, agregamos muchas funciones nuevas a Herramientas de Escritura. Con la integración de ChatGPT, ahora puedes generar contenido sobre lo que quieras escribir o crear imágenes con una simple indicación.
Herramientas de Escritura ahora están disponibles en visionOS. Funcionan prácticamente en todo, Mail, Notas y en las apps que creas.
Lo nuevo en iOS, iPadOS y macOS 26 es que luego de describir los cambios para reescribir el texto, puedes ingresar una solicitud de seguimiento.
Por ejemplo, puedes pedir que el texto sea más cálido, conversacional o alentador.
Además, Herramientas de Escritura está disponible como atajo para que puedas llevar tus flujos de trabajo al siguiente nivel con Apple Intelligence. Las herramientas como revisar, reescribir y resumir ahora se pueden usar de forma automatizada.
También agregamos una variedad de API para que tu app admita Herramientas de Escritura. Puedes obtener el botón de la barra y los menús estándar, solicitar a Herramientas de Escritura intenciones para texto enriquecido o integrar su potente coordinador en tu motor de texto. Luego veremos más sobre las nuevas opciones de resultados y la API del coordinador.
Veamos cómo personalizar Herramientas de Escritura en las vistas de texto nativas que ofrece el sistema.
El video de Herramientas de Escritura del año pasado cubre los conceptos básicos. Para las vistas de texto nativo, puedes obtener soporte para Herramientas de Escritura gratuito. Puedes usar el ciclo de vida para reaccionar a operaciones de la función, usar su comportamiento limitado o completo, especificar rangos de no reescritura o administrar el texto enriquecido, listas o tablas. Recuerda que, previamente, las opciones de resultados se llamaban “AllowedInputOptions” y ahora se llaman “WritingToolsResultOptions”.
La función está disponible cuando seleccionas texto y, si tu app tiene mucho texto, considera agregar un botón, como hicimos para Notas y Mail.
Para hacerlo, usa UIBarButtonItem en UIKit o NSToolbarItem en AppKit.
En el menú contextual, los elementos de Herramientas de Escritura se insertan automáticamente. Si usas menús personalizados o si deseas mover los elementos, puedes establecer automaticallyInsertsWritingToolsItems como falso y usar writingToolsItems para obtener los elementos estándar. Este año actualizamos las opciones Revisar, Reescribir y Resumen en el menú. El uso de la API garantiza que recibirás todas las actualizaciones gratis.
Ahora, hablemos de formato.
Las apps tienen varios tipos de vistas de texto. Algunas vistas no admiten texto enriquecido, como el campo de búsqueda del Finder. Otras vistas sí admiten texto enriquecido, como TextEdit.
Algunas vistas de texto admiten estilos semánticos, como Notas. Puedes especificar párrafos con diferentes estilos semánticos, como encabezado, subtítulo o cita en bloque. Por ejemplo, en Notas, el resultado de Herramientas de Escritura puede ser de encabezados, tablas y listas nativas de Notas. Para indicar a Herramientas de Escritura qué tipo de texto admite tu vista de texto, usa las opciones de resultados de Herramientas de Escritura. Para vistas de texto simple, usa la opción de resultado plainText. Herramientas de Escritura usará NSAttributedString para comunicarse con tu vista de texto, pero puedes ignorar con seguridad todos los atributos internos. Para vistas de texto enriquecido, como la de TextEdit, usa la opción de resultado richText, con o sin las opciones de lista y tabla, según si tu vista de texto las admite o no. Herramientas de Escritura puede agregar a la cadena atributos de visualización como negrita o cursiva.
Las apps que tienen una comprensión especializada de formatos semánticos, como Notas, pueden usar la opción richText con la nueva opción presentationIntent. Herramientas de Escritura usará NSAttributedString con intenciones de presentación para comunicar con tu vista de texto.
Ahora, cuál es la diferencia entre los atributos de visualización y las intenciones de presentación.
En el ejemplo de TextEdit, Herramientas de Escritura produce texto enriquecido usando atributos de visualización como negrita o cursiva, y envía la cadena atribuida a la vista de texto. Estos atributos transportan información estilística, como tamaños de fuente, pero no información semántica. Por otro lado, Notas intenta usar al máximo los estilos semánticos nativos, como los encabezados. Herramientas de Escritura generó el mismo texto debajo, pero en su lugar agregamos intenciones de presentación a la cadena atribuida. Notas puede luego convertir las intenciones de presentación a sus estilos semánticos internos. Aquí puedes ver que la parte de encabezados es solo una intención de encabezado sin atributos de fuente concretos.
Incluso al especificar .presentationIntent en las opciones de resultados, Herramientas de Escritura puede agregar atributos de visualización a la cadena, ya que algunos estilos no pueden representarse con intenciones de presentación. Aquí, Herramientas de Escritura usa una intención de presentación enfatizada y un atributo de visualización tachado para representar el texto “crucial and deleted” en la captura de pantalla.
En resumen, en el modo de intención de presentación, establecemos estilos en el formato de intención de presentación siempre que sea posible. Esto incluye elementos como listas, tablas y bloques de código.
Los atributos de visualización se pueden usar para atributos como subrayados, subíndices y superíndices. Por último, las intenciones de presentación no tienen un estilo predeterminado. Tu app es la que convierte las intenciones de presentación en atributos de visualización o en sus propios estilos internos.
Para que Herramientas de Escritura comprenda mejor la semántica del texto, puedes anular el método requestContexts para la vista de texto y proporcionar un contexto con intenciones de presentación.
Por último, si tienes un motor de texto completamente personalizado, ¡también puedes usarlas!
Puedes obtener la experiencia básica de Herramientas de Escritura gratis, siempre que tu motor de texto haya adoptado protocolos de edición de texto comunes. En iOS, es UITextInteraction o UITextSelectionDisplayInteraction con UIEditMenuInteraction. En macOS, tu vista debe adoptar NSServicesMenuRequestor, esto le brinda Herramientas de Escritura a la vista de texto, y soporte para las funciones del menú Servicios. Para obtener detalles sobre el uso básico, consulta la sesión WWDC24.
Si quieres ir más allá, puedes implementar la experiencia completa de Herramientas de Escritura. Esto le da a Herramientas de Escritura la capacidad de reescribir texto en el lugar, proporcionar animación y mostrar cambios de revisión directamente en línea. Este año agregamos las API de coordinación de Herramientas de Escritura para motores de texto personalizados.
El coordinador administra las interacciones entre tu vista y Herramientas de Escritura.
Adjuntas un coordinador a tu vista y creas un delegado para implementar los métodos WritingToolsCoordinatorDelegate. El delegado prepara el contexto, incorpora cambios, proporciona vistas previas durante las animaciones, ofrece coordenadas para las marcas de revisión y responde a los cambios de estado. Para que todo esto cobre vida, veamos una demostración rápida.
Aquí tengo un motor de texto personalizado creado con TextKit 2. Como puedes ver, ya implementamos protocolos de edición de texto comunes como NSTextInputClient y NSServicesMenuRequestor.
Si creo y ejecuto la app, obtengo gratis el soporte básico de Herramientas de Escritura. Todos los resultados se mostrarán en un panel. Por ejemplo, puedo hacer una reescritura.
Y reemplazar o copiar el resultado.
Ahora implementemos el soporte completo para Herramientas de Escritura.
En DocumentView, agregaré algunas propiedades de instancia necesarias para una sesión de Herramientas de Escritura, inicializaré un objeto NSWritingToolsCoordinator, estableceré el delegado en “self” y lo asignaré a un NSView. También necesito establecer “configureWritingTools” en “init”.
Por supuesto, dice que DocumentView no se ajusta a “NSWritingToolsCoordinator.Delegate”.
Arrastremos un archivo que implemente todos los métodos delegados, en una extensión DocumentView. Puedes ver que prepara el contexto, reemplaza y selecciona texto, devuelve cuadros delimitadores para revisión, genera vistas previas para animaciones, etc.
Creemos y ejecutemos la app.
Si reescribo el texto, puedes ver que la animación y el cambio de texto ocurren en la vista de texto.
Y si lo corrijo, puedes ver los subrayados agregados por Herramientas de Escritura.
También puedo hacer clic en las sugerencias individuales para mostrar lo que cambió.
Ahora veamos cada uno de esos pasos con más detalle.
Lo primero es crear un coordinador y asociarlo a una vista. El coordinador de Herramientas de Escritura es una UIInteraction en UIKit y se adjunta a su UIView al igual que otras UIInteractions. En AppKit, es una propiedad de instancia en NSView. Una vez que tengas un coordinador, puedes configurar el comportamiento de Herramientas de Escritura y las opciones de resultados que prefieras.
Ahora, vayamos a los métodos delegados. Primero, Herramientas de Escritura necesita un contexto para el texto actual. Un contexto tiene un fragmento de texto como NSAttributedString y un rango de selección. Como mínimo, debes incluir la selección de texto actual en la cadena de atributos. También puedes incluir el párrafo antes y después de la selección: esto le da a Herramientas de Escritura una mejor comprensión del contexto. Estableces el rango en lo que está seleccionado actualmente, según context.attributedString. Si no se selecciona nada, devuelve todo el documento como contexto y establece el rango en la ubicación del cursor. Esto le permite a Herramientas de Escritura trabajar en todo el documento, cuando las personas no seleccionaron nada específicamente. Así es como se proporciona contexto. Esto es AppKit, pero a menos que lo señale específicamente, puedes asumir que UIWritingToolsCoordinator y NSWritingToolsCoordinator se comportan igual. Los métodos delegados son asincrónicos, porque las vistas de texto grandes pueden tardar un tiempo en procesar el almacenamiento de texto subyacente. En el cuerpo de la función, prepara el texto y el rango dependiendo del parámetro "scope". La mayoría de las veces, solo es necesario devolver un contexto. Para vistas sofisticadas en las que se puede seleccionar texto en varios almacenamientos al mismo tiempo, también se admiten múltiples contextos.
Luego de evaluar el texto de tu vista, Herramientas de Escritura ofrece cambios sugeridos para el objeto delegado. En este método delegado de reemplazo de texto, incorpora el cambio en el almacenamiento de texto de tu vista. Herramientas de Escritura ejecuta este método para cada cambio y puede hacerlo varias veces con diferentes valores de rango para el mismo objeto de contexto. Finalizado el procesamiento, Herramientas de Escritura puede solicitar al delegado que actualice el rango de texto seleccionado.
Para animar el texto mientras Herramientas de Escritura lo procesa, el coordinador solicita imágenes de vista previa para ciertos rangos de texto.
La vista de texto debe devolver vistas previas mostrando el texto sobre un fondo claro. Durante las animaciones, Herramientas de Escritura aplica los efectos visuales a las imágenes de vista previa proporcionadas y no al texto en sí. En macOS, esto se realiza con dos métodos delegados. El primer método delegado toma una matriz. Deberías devolver al menos una vista previa de todo el rango. También puedes devolver una vista previa por línea para una animación más fluida.
En iOS, UIKit usa UITargetedPreview, no NSTextPreview, y solo se usa un método delegado.
Antes y después de la animación real, Herramientas de Escritura ejecuta los métodos prepareFor y finish. Para prepararse para la animación de texto, oculta el rango específico de texto de la vista de texto. Finalizada la animación, muestra nuevamente el rango específico de texto.
Para la revisión, Herramientas de Escritura muestra un subrayado para los rangos de texto que se modificaron. Herramientas de Escritura también responde a eventos de clic en rangos de texto para mostrar la ventana emergente de revisión en línea.
Para mostrar las marcas de revisión, el coordinador solicita al delegado que devuelva las rutas de subrayado de Bézier para rangos individuales. Herramientas de Escritura también necesita la ruta Bézier delimitadora para responder a eventos de clic o toque.
Por último, puedes implementar el writingToolsCoordinator:willChangeToState:completion: método para responder a los cambios de estado. Es posible que desees deshacer la fusión, detener la sincronización o evitar la edición, según la implementación de tu vista de texto. Por el contrario, debes informar al coordinador sobre los cambios externos con updateRange:withText para que las operaciones de Herramientas de Escritura estén sincronizadas con el texto más reciente. Usa updateForReflowedText para notificar a Herramientas de Escritura sobre cambios de diseño en tu vista. Cuando llamas a este método, Herramientas de Escritura solicita nuevas vistas previas, marcas de revisión y otra información que depende del diseño.
Vimos cómo integrar la experiencia completa de Herramientas de Escritura con tu potente motor de texto personalizado. También publicamos el proyecto que mostré antes como código de muestra. Consulta el código de muestra y la documentación completa sobre el coordinador de Herramientas de Escritura para más información.
Con esto finaliza la sesión. ¿Qué sigue? Prueba las nuevas funciones de Herramientas de Escritura. Y los ajustes de seguimiento luego de describir tus cambios. O Herramientas de Escritura en el Vision Pro y la app Atajos.
Agrega un botón en la barra de herramientas, si tu app tiene mucho texto.
Juega con las opciones de formato para permitir que Herramientas de Escritura lea y escriba estilos semánticos, como encabezados, subtítulos y bloques de código.
Si ya tienes un potente motor de texto, poténcialo con la experiencia completa de Herramientas de Escritura.
Consulta también “Get started with Writing Tools” y el código de muestra que aparece a continuación si quieres ver cómo funciona el coordinador en acción. Gracias por acompañarnos.
-
-
11:46 - Attach a coordinator to the view (UIKit)
// Attach a coordinator to the view // UIKit func configureWritingTools() { guard UIWritingToolsCoordinator.isWritingToolsAvailable else { return } let coordinator = UIWritingToolsCoordinator(delegate: self) addInteraction(coordinator) }
-
12:02 - Attach a coordinator to the view (AppKit)
// Attach a coordinator to the view // AppKit func configureWritingTools() { guard NSWritingToolsCoordinator.isWritingToolsAvailable else { return } let coordinator = NSWritingToolsCoordinator(delegate: self) coordinator.preferredBehavior = .complete coordinator.preferredResultOptions = [.richText, .list] writingToolsCoordinator = coordinator }
-
13:06 - Prepare the context
// Prepare the context func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, requestsContextsFor scope: NSWritingToolsCoordinator.ContextScope, completion: @escaping ([NSWritingToolsCoordinator.Context]) -> Void) { var contexts = [NSWritingToolsCoordinator.Context]() switch scope { case .userSelection: let context = getContextObjectForSelection() contexts.append(context) break // other cases… } // Save references to the contexts for later delegate calls. storeContexts(contexts) completion(contexts) }
-
13:48 - Respond to text changes from Writing Tools and update selected range
// Respond to text changes from Writing Tools func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, replace range: NSRange, in context: NSWritingToolsCoordinator.Context, proposedText replacementText: NSAttributedString, reason: NSWritingToolsCoordinator.TextReplacementReason, animationParameters: NSWritingToolsCoordinator.AnimationParameters?, completion: @escaping (NSAttributedString?) -> Void) { } // Update selected range func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, select ranges: [NSValue], in context: NSWritingToolsCoordinator.Context, completion: @escaping () -> Void) { }
-
14:41 - Generate preview for animation (AppKit)
// Generate preview for animation (macOS) func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, requestsPreviewFor textAnimation: NSWritingToolsCoordinator.TextAnimation, of range: NSRange, in context: NSWritingToolsCoordinator.Context, completion: @escaping ([NSTextPreview]?) -> Void) { } func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, requestsPreviewFor rect: NSRect, in context: NSWritingToolsCoordinator.Context, completion: @escaping (NSTextPreview?) -> Void) { }
-
14:58 - Generate preview for animation (UIKit)
// Generate preview for animation (iOS) func writingToolsCoordinator(_ writingToolsCoordinator: UIWritingToolsCoordinator, requestsPreviewFor textAnimation: UIWritingToolsCoordinator.TextAnimation, of range: NSRange, in context: UIWritingToolsCoordinator.Context, completion: @escaping (UITargetedPreview?) -> Void) { }
-
15:08 - Delegate callbacks before and after animation
// Generate preview for animation func writingToolsCoordinator( _ writingToolsCoordinator: NSWritingToolsCoordinator, prepareFor textAnimation: NSWritingToolsCoordinator.TextAnimation, for range: NSRange, in context: NSWritingToolsCoordinator.Context, completion: @escaping () -> Void) { // Hide the specific range of text from the text view } func writingToolsCoordinator( _ writingToolsCoordinator: NSWritingToolsCoordinator, finish textAnimation: NSWritingToolsCoordinator.TextAnimation, for range: NSRange, in context: NSWritingToolsCoordinator.Context, completion: @escaping () -> Void) { // Show the specific range of text again }
-
15:39 - Delegate callbacks to show proofreading marks
// Create proofreading marks func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, requestsUnderlinePathsFor range: NSRange, in context: NSWritingToolsCoordinator.Context, completion: @escaping ([NSBezierPath]) -> Void) { } func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator, requestsBoundingBezierPathsFor range: NSRange, in context: NSWritingToolsCoordinator.Context, completion: @escaping ([NSBezierPath]) -> Void) { }
-
-
- 0:00 - Introducción
En este video, repasaremos las novedades de Herramientas de Escritura y explicaremos cómo personalizar la experiencia de tu app, cómo admitir texto enriquecido y cómo integrarlas en motores de texto personalizados.
- 0:46 - Novedades
Herramientas de Escritura ahora admite la integración con ChatGPT, visionOS, las solicitudes de seguimiento para realizar ajustes de tono y la automatización por medio de atajos. Herramientas de Escritura también proporciona nuevas API diseñadas para ayudarte a integrarlas en tu app.
- 2:21 - Personalizar las vistas de texto nativo
Si tu app utiliza vistas de texto nativas, obtendrás soporte de Herramientas de Escritura sin costo. Puedes personalizar aún más la experiencia si adoptas métodos de ciclo de vida para reaccionar a operaciones, como pausar la sincronización, especificar rangos ignorados dentro del texto, proporcionar un botón de la barra de herramientas o personalizar los menús contextuales.
- 4:00 - Formato de texto enriquecido
Herramientas de Escritura ahora admite texto enriquecido con estilos semánticos. Si tu app admite intenciones de presentación, como encabezados, subtítulos, citas, tablas y listas, puedes brindar esa información a Herramientas de Escritura. Para brindar resultados, Herramientas de Escritura utilizará los estilos de intención de presentación compatibles con tu app siempre que sea posible.
- 7:41 - Motores de texto personalizados
Si tu app utiliza un motor de texto personalizado, ahora puedes brindar una experiencia totalmente integrada con Herramientas de Escritura. La experiencia básica de Herramientas de Escritura funciona automáticamente, siempre que adoptes protocolos comunes de edición de texto. La experiencia completa de Herramientas de Escritura permite reescribir texto directamente en el lugar, aplicar animaciones y mostrar cambios de revisión en línea. Para aprovechar la experiencia completa, utiliza la nueva API de coordinación de Herramientas de Escritura para integrarla en tu motor de texto personalizado.
- 16:58 - Próximos pasos
Explora las nuevas funcionalidades de Herramientas de Escritura y aprovecha la personalización y la compatibilidad con el texto enriquecido en tu app. Si tienes un motor de texto personalizado, adopta la API de coordinación de Herramientas de Escritura para brindar la experiencia completa.