Touch on Mac para desarrolladores: 36 puntos y Sidecar
¿Qué cambia el toque en la Mac para los desarrolladores de Mac? Las apps existentes funcionan porque “macOS automatically translates touches into clicks” (macOS traduce los toques en clics automáticamente), y tres Tech Talks fijan las reglas: los reconocedores de gestos son “the only way to get direct touches on macOS” (la única forma de recibir toques directos en macOS), los controles estándar son nativos para el toque, el objetivo táctil mide 36 puntos, el hover no tiene equivalente y un iPad por Sidecar es el banco de pruebas.1234 Las API de toque ya están en el SDK de macOS 27.0; los interruptores de gestos del sistema y un ActivityKit disponible en macOS no lo están, en los dos SDK que revisé, y la beta de Xcode 27.3 figura como “Coming soon” (próximamente).25678
TL;DR: Apple anunció el toque en la MacBook Pro with PROLED XDR Display (14.2 y 16.3 pulgadas, preventa el 28 de octubre, en tiendas el 6 de noviembre) y explicó a los desarrolladores cómo adoptarlo en tres charlas el 28 de octubre.129 Si tu app usa controles estándar de AppKit, gestos de SwiftUI o Mac Catalyst, la charla dice que “just work” (simplemente funcionan), y la auditoría de abajo (áreas de toque, hover) sigue aplicando. El código propio de mouseDown(with:) se emula hasta que pase a eventos de control o a reconocedores de gestos, y un framework de UI que no es de Apple recibe una capa de emulación genérica que NSIsTouchNative desactiva cuando la app ya maneja el toque por su cuenta.36 Para recibir un toque directo en AppKit necesitas un reconocedor de gestos, porque los toques nunca llegan a la cadena de respondedores ni a los monitores de eventos.36 La charla de diseño fija el objetivo táctil en 36 puntos, el mismo tamaño físico que 44 puntos en iOS, y dice que macOS se ve igual con toque y sin él.4 Prueba con un iPad por Sidecar; las piezas más nuevas son macOS 27.2 y la release candidate de Xcode 27.2, una configuración que no he ejecutado.311 Las API de toque ya están en el SDK de macOS 27.0. El interruptor de gestos del sistema y un ActivityKit disponible en macOS no aparecen en los dos SDK que revisé, y la beta de Xcode 27.3 figura como “Coming soon”.2378
Lo que Apple ha publicado y lo que no
El anuncio de Apple fue un comunicado de prensa, no un keynote; el post en vivo tiene el registro del día. El contenido para desarrolladores del comunicado son tres frases en la sección “Touch Arrives on Mac”: “Apple apps are optimized for the new MacBook Pro, and many existing apps work with Touch right away, because macOS automatically translates touches into clicks” (las apps de Apple están optimizadas para la nueva MacBook Pro, y muchas apps existentes funcionan con Touch de inmediato porque macOS traduce automáticamente los toques en clics), luego “Updated system gesture APIs also enable developers to create intuitive experiences designed specifically for Touch” (las API de gestos del sistema actualizadas también permiten a los desarrolladores crear experiencias intuitivas diseñadas específicamente para Touch), y la nota de que “app developers can test how Touch performs in their iOS and iPadOS apps directly on the MacBook Pro display” (los desarrolladores de apps pueden probar cómo funciona Touch en sus apps de iOS y iPadOS directamente en la pantalla de la MacBook Pro).1 La sección sobre macOS dice que la laptop “comes to life with macOS 27” y nombra “Touch built for macOS 27”; no nombra una versión puntual.1
El lado para desarrolladores estaba publicado a las 11:47 a.m. PT: una noticia, “Say hello to Touch on Mac”, y una página de aterrizaje, “Get ready for Touch on Mac”, con tres Tech Talks, Group Labs el 18 y el 19 de noviembre y tres mosaicos marcados “Coming soon”: “Xcode 27.3 beta”, “Documentation resources” y “Design resources”.2 El HTML de la página trae los enlaces que Apple piensa poner en esos mosaicos, dentro de comentarios marcados para reactivarse cuando los recursos salgan: un artículo de AppKit, “Adopting gesture recognizers in your app”, que hoy devuelve 404, el ejemplo existente de arrastrar y soltar con file promises y, entre sus enlaces, cuatro páginas de las Human Interface Guidelines y Apple Design Resources; las páginas de las HIG que capturé no contienen ninguna guía sobre el toque en la pantalla de la Mac, y el registro de cambios de la página de Live Activities termina el 13 de octubre.2710
Así que las fuentes primarias de las reglas son las charlas y una nota técnica que Apple publicó el 8 de junio, “TN3212: Adopting gesture recognizers for Sidecar touch support”, cuyo Overview dice que “In macOS 27, AppKit continues to standardize on gesture recognizers as the primary mechanism for input handling” (en macOS 27, AppKit sigue estandarizando los reconocedores de gestos como mecanismo principal de entrada), y cuyas secciones “Explore updated APIs in macOS 27”, “Detect touch capability”, “Handle control events” y “Configure scroll behavior” describen la superficie de API que las charlas del 28 de octubre demuestran.6 Cada símbolo nuevo que nombra la nota técnica está en la documentación de Apple con introducedAt macOS 27.0 y sin marca de beta, consultada el 28 de octubre al mediodía PT, y, salvo las dos claves de Info.plist, declarado en el SDK de macOS 27.0 dentro de Xcode 27.1 (27A9275), según revisé en los encabezados y las interfaces Swift de esta Mac (análisis del autor).7 Los tres símbolos de gestos del sistema que nombra la charla no lo están, ni tampoco un ActivityKit disponible en macOS; ambos casos van más abajo.
Nada que hacer, y lo que obtienes a cambio
La historia de compatibilidad es generosa. La charla de AppKit abre con ella: “The good news is that we’ve already made touch work great out of the box for all apps. Across our native frameworks, standard components just work with native touch. Existing gestures created in SwiftUI just work” (0:30) (la buena noticia es que ya hicimos que el toque funcione muy bien de fábrica en todas las apps; en nuestros frameworks nativos, los componentes estándar simplemente funcionan con el toque nativo; los gestos existentes creados en SwiftUI simplemente funcionan), y lo mismo para Mac Catalyst (0:52).3 En AppKit, “Standard buttons, controls, tables, collections, split views, tabs, scrolling, and more are all touch native” (1:10).3
Lo que no es nativo se emula: “for existing custom AppKit mouse interactions, or if you use non-Apple UI frameworks, AppKit intelligently emulates the mouse” (1:17) (para las interacciones de mouse personalizadas que ya existen en AppKit, o si usas frameworks de UI que no son de Apple, AppKit emula el mouse de forma inteligente).3 La nota técnica detalla la emulación para frameworks de terceros: “A tap emulates a mouse-down followed immediately by a mouse-up”, “A touch and immediate pan emulates trackpad scroll events, even if the UI doesn’t respond to them”, “A long press without movement emulates a rightMouseDown(with:) (optionally followed by rightMouseDragged(with:)) with a rightMouseUp(with:) on touch lift” y “A two-finger pinch or rotation simultaneously emulates both the trackpad magnify and rotate gestures”.6 La versión de la charla: “a one-finger scroll with momentum, click, drag with a small hold delay, and even pinch for rotation and magnification” (11:28).3 La emulación es por ventana y genérica, porque “AppKit can’t determine what kind of interactions are allowed at any particular location of your non-Apple UI framework content” (11:17) (AppKit no puede determinar qué tipo de interacciones se permiten en cada ubicación concreta del contenido de tu framework de UI que no es de Apple).3
Cuando ya agregaste soporte nativo, apagas la emulación: “add an NSIsTouchNative entry to your Info.plist to let AppKit know you are touch native and no longer need the non-Apple UI toolkit mouse emulations” (11:47).3 La clave está documentada como macOS 27.0, y su página dice “Most AppKit apps don’t need this key. It’s primarily intended for apps that embed a non-AppKit rendering or input framework and implement their own touch-handling pipeline.” (la mayoría de las apps de AppKit no necesitan esta clave; está pensada principalmente para apps que integran un framework de renderizado o de entrada ajeno a AppKit e implementan su propia canalización de manejo de toques).7
El enfoque de la charla de diseño importa para lo que “nada que hacer” significa en lo visual: “macOS on a device that supports touch doesn’t look any different than macOS on a device that doesn’t. The resolution, the size of windows, text and UI controls haven’t changed” (0:41), y “Touch is a secondary input for macOS, and therefore has little impact on how macOS looks” (1:06) (el toque es una entrada secundaria para macOS y, por lo tanto, tiene poco impacto en el aspecto de macOS).4 No hay modo táctil ni diseño compacto. Es lo contrario de la situación del iPhone Duo, donde la pantalla interna reporta clases de tamaño regular en ambas dimensiones.
Los reconocedores de gestos son la única entrada
La frase que ordena todo lo demás está en el 3:45 de la charla de AppKit: “In fact, gesture recognizers are the only way to get direct touches on macOS.”3 Antes de ella: “Starting with macOS Golden Gate, gesture recognizers are the preferred approach in AppKit” (3:33), y “gesture recognizers have become the shared input language across SwiftUI, Mac Catalyst, and now AppKit” (3:38) (los reconocedores de gestos son ya el lenguaje de entrada común de SwiftUI, Mac Catalyst y ahora AppKit).3 La nota técnica dice lo mismo desde el otro lado: “AppKit doesn’t deliver Sidecar touch events through the responder chain or through event monitors”, y en una nota, “Local and global event monitors don’t receive touch events. Touch events don’t go through NSApp or sendEvent(:).” (los monitores de eventos locales y globales no reciben eventos táctiles; los eventos táctiles no pasan por NSApp ni por sendEvent(:)).6
Eso tiene tres consecuencias para una base de código de AppKit.
Primero, los bucles de seguimiento. El ingeniero de la charla reconstruye un rompecabezas de cableado que usaba “a custom NSView with a mouseDown(with:) override that uses the standard tracking loop technique” (3:13), llamando a nextEvent(matching:) hasta que se suelta el mouse, y dice “Migrate your mouse tracking loops to gesture recognizers” (3:51).3 La migración no es de todo o nada: “tracking loops are still supported and can coexist with touch-only gesture recognizers. You may find that adding touch-only gesture recognizers is the fastest and least risky path for a dot release of your app” (3:58) (los bucles de seguimiento siguen siendo compatibles y pueden convivir con reconocedores de gestos solo táctiles; quizá descubras que agregar reconocedores solo táctiles es el camino más rápido y de menor riesgo para una versión menor de tu app).3 El primer paso es la refactorización que hace la charla antes de agregar nada: “The first step is to refactor my tracking loop into separate start, continue, end, and cancel tracking functions” (4:11), para que el bucle del mouse y el reconocedor táctil puedan compartirlas.3 El listado de Apple, textual:
// Refactored tracking functions
func startTracking(at viewLocation: NSPoint) { /* ... */ }
func continueTracking(at viewLocation: NSPoint) { /* ... */ }
func endTracking(at viewLocation: NSPoint) { /* ... */ }
func cancelTracking() { /* ... */ }
La receta de un reconocedor solo táctil se reduce entonces a dos asignaciones de propiedades: “set the buttonMask to 0 and allowedTouchTypes to .direct on an initialized NSPanGestureRecognizer” (4:29).3
// Add touch-only pan gesture recognizer
let touchRecognizer = NSPanGestureRecognizer(
target: self,
action: #selector(touchPan)
)
touchRecognizer.buttonMask = 0x0
touchRecognizer.allowedTouchTypes = .direct
wiringPanelView.addGestureRecognizer(touchRecognizer)
La acción dirige los estados .began, .changed, .ended y .cancelled del reconocedor a las cuatro funciones. La razón de la ruta de cancelación es la que dio la charla para el botón: “If tracking is canceled due to a system gesture like Exposé, scroll, or any other reason, I can revert any unintended changes” (2:41) (si el seguimiento se cancela por un gesto del sistema como Exposé, un desplazamiento o cualquier otra razón, puedo revertir cualquier cambio no deseado), y la regla de la nota técnica es “Handle cancellation”.36
// Pan gesture recognizer action function
@objc func touchPan(_ recognizer: NSPanGestureRecognizer) {
switch recognizer.state {
case .began:
startTracking(at: recognizer.location(in: wiringPanelView))
case .changed:
continueTracking(at: recognizer.location(in: wiringPanelView))
case .ended:
endTracking(at: recognizer.location(in: wiringPanelView))
case .cancelled:
cancelTracking()
default:
break
}
}
NSPanGestureRecognizer existe desde macOS 10.10 y allowedTouchTypes desde 10.12.2; nada en esa receta es nuevo.7
Segundo, las reglas que imponen los reconocedores. La nota técnica: “If your view is covered by another, often transparent, view, your gesture recognizer won’t be triggered” (si otra vista, a menudo transparente, cubre la tuya, tu reconocedor no se activa), y “You can’t place views on top of standard framework controls, because those controls now use gesture recognizers internally”, con la salida que propone la propia nota: “If necessary, rearrange the siblings, or override the occluding view’s hitTest(:) method and return nil to ensure it doesn’t block events going to underlying controls.” (si es necesario, reordena las vistas hermanas o sobrescribe el método hitTest(:) de la vista que tapa y devuelve nil para que no bloquee los eventos dirigidos a los controles de abajo).6 Un reconocedor propio tiene que terminar: “End your active gesture recognizer by transitioning to ended, failed, or cancelled. If you don’t, recognizers are blocked from activating.”6 Y hay un cambio de comportamiento limitado a las subclases compiladas con el SDK nuevo: “In apps built with the macOS 27 SDK and Xcode 27, location(in:) on NSGestureRecognizer returns NSZeroPoint and logs an error if the receiver’s class doesn’t override the method”, porque “Subclasses of NSGestureRecognizer must implement location(in:) to report a meaningful location.” (las subclases de NSGestureRecognizer deben implementar location(in:) para informar una ubicación significativa).6
Tercero, lo que pierdes. Para las acciones de los controles, la nota técnica dice que el paso a reconocedores en NSControl “changes the timing of when AppKit delivers control action messages with respect to event processing”, así que currentEvent “no longer returns the event that triggered an action” (ya no devuelve el evento que disparó la acción), remite a NSEvent.pressedMouseButtons y a modifierFlags a nivel de clase, y agrega que “a touch is not part of pressedMouseButtons”.6 Y una subclase que sobrescribe un método del botón izquierdo del mouse lo paga: “If you subclass an AppKit control and override any of the left-mouse responder methods, that control falls back to a tracking loop path for compatibility.” (si creas una subclase de un control de AppKit y sobrescribes cualquiera de los métodos de respuesta del botón izquierdo del mouse, ese control vuelve a la ruta de bucle de seguimiento por compatibilidad).6
Controles: eventos en lugar de mouseDown
La primera refactorización de la charla de AppKit es un botón. El original heredaba de NSButton y sobrescribía mouseDown(with:) para saber cuándo empezaba y terminaba el seguimiento; con el toque “the buttons work, but AppKit must emulate mouse events to pass to the mouseDown override” (2:17) (los botones funcionan, pero AppKit tiene que emular eventos del mouse para pasarlos a la sobrescritura de mouseDown).3 El reemplazo son los eventos de NSControl “directly on NSButton without the need to subclass” (2:27); el listado del 2:24 en la página de la charla registra tres llamadas a addTarget(_:action:for:) en el botón, para [.trackingBegan, .trackingEntered], [.trackingExited, .trackingEndedInside] y .trackingCancelled, y los eventos además exponen el estado que una sobrescritura del mouse nunca veía: “If tracking is canceled due to a system gesture like Exposé, scroll, or any other reason, I can revert any unintended changes” (2:41).3 Los eventos son viejos: “NSControl events are available for standard AppKit controls, and most control events are available all the way back to macOS 11” (2:51) (los eventos de NSControl están disponibles para los controles estándar de AppKit, y la mayoría existe desde macOS 11).3 La charla remite, para el patrón, a la sesión de la WWDC26 que llama “Modernizing your AppKit app”; la sesión que la nota técnica lista como video relacionado es “Modernize your AppKit app” (sesión 289 de la WWDC26).36
macOS 27 agrega casos a NSControl.Events, según la sección “Handle control events” de la nota técnica: trackingRepeated (“An event when multiple mouseDown(with:) events with a click count greater than 1 occur”, varios eventos mouseDown(with:) con un conteo de clics mayor que 1), valueChanged (“An event when the value changes on continuous controls, such as sliders”, cambios de valor en controles continuos como los sliders), primaryActionTriggered, menuActionTriggered (“An event that triggers when a menu gesture occurs, but before the menu presents”, se dispara cuando ocurre un gesto de menú, pero antes de que aparezca el menú) y applicationReserved para los tuyos.67
Después, la exclusividad. “By default, only one view can be interacted with at a time” (7:20) (por defecto, solo se puede interactuar con una vista a la vez), lo que la charla llama exclusividad de gestos y la nota técnica explica como compatibilidad: “For maximum compatibility, AppKit restricts gesture activations to a single view hierarchy at a time”, y “Unlike in iOS, the person can’t perform multiple interactions simultaneously, though scrolling is a notable exception.” (a diferencia de iOS, no se pueden hacer varias interacciones a la vez, salvo el desplazamiento).36 La exclusión se hace por vista: “The API to control gesture exclusivity is the exclusiveGestureBehavior property on NSView” (7:48). El valor por defecto de la propiedad “inherits its parent’s exclusive gesture behavior” (7:57) (hereda el comportamiento de exclusividad de gestos de la vista padre), y “By setting the exclusiveGestureBehavior property on the stove view to .notExclusive, the child slider subviews all become non-exclusive as well” (8:01); la app entera se excluye con la clave NSViewGestureRecognizerIsExclusive de Info.plist.367 La charla dice que la propiedad “is available in the next SDK” (7:54) (está disponible en el próximo SDK). La documentación de Apple la lista como macOS 27.0 sin marca de beta, la nota técnica de junio la describe, y el SDK de macOS 27.0 dentro de Xcode 27.1 la declara API_AVAILABLE(macos(27.0)) con el comentario “Defaults to .inherit” en NSView.h, así que el SDK que la charla llama “next” ya estaba publicado cuando salió la charla (análisis del autor a partir de los encabezados instalados).367
36 puntos
La charla de diseño da la cifra tres veces y la charla de AppKit la repite. “Touch on macOS uses a touch target of 36 points. This creates the same physical size on display as iOS’s 44 points” (9:17) (el objetivo táctil de 36 puntos tiene en pantalla el mismo tamaño físico que los 44 puntos de iOS).4 El objetivo es invisible a propósito: “All macOS’s framework controls have been updated to use this new touch target, but notice it’s invisible. The controls haven’t changed size and therefore don’t require a new layout” (9:26) (todos los controles de los frameworks de macOS se actualizaron para usar este nuevo objetivo táctil, pero es invisible; los controles no cambiaron de tamaño y, por lo tanto, no requieren un diseño nuevo).4
Para las vistas propias, la instrucción es ampliar el área de toque, no el control. Los nodos de cableado de la charla de AppKit eran “a little tricky to touch” (5:14), así que el ingeniero agregó un parámetro expandHitRect que “expands the size of the target rect to a minimum of 36 points on each axis. This makes it easier for a touch to hit a node while still requiring the mouse to be precise and without modifying the layout” (5:50) (amplía el rectángulo del objetivo a un mínimo de 36 puntos por eje, lo que facilita que un toque alcance un nodo sin dejar de exigir precisión al mouse y sin modificar el diseño), una técnica que recomienda “for small resize or grab handles for selected objects in a canvas view” (6:07).3 La versión de la charla de diseño para controles que no son de Apple: “consider increasing the touch target area around your control instead of changing the control size” (9:51).4
Los tamaños de control no se mueven. “When designing inspectors or other control-heavy areas, medium-sized controls continue to be the default control size. Window toolbars use extra-large-sized controls by default. Large and extra-large controls should not be used outside of the toolbar” (9:58) (al diseñar inspectores u otras áreas con muchos controles, los controles medianos siguen siendo el tamaño por defecto; las barras de herramientas de las ventanas usan controles extragrandes por defecto; los grandes y extragrandes no deben usarse fuera de la barra de herramientas), y “They should only be used sparingly to emphasize key moments or in apps of which content consumption is the primary use case” (10:14).4 Para vistas tipo configuración, “use FormStyle. Here as well, each row by default measures the 36-point height” (10:28).4 Los controles pequeños y mini siguen siendo válidos: “They fully support touch regardless of their size” (10:46), con una regla para los propios: “If your app is using custom small controls, ensure touch works, even though the tap target might be small” (10:50), porque “touch events should never be ignored” (11:00) (los eventos táctiles nunca deben ignorarse).4
El framework hace la parte difícil en los tres controles que no pueden medir 36 puntos: “the stepper, dial, and slider” (13:54) “now expand in place when interacting via touch” (14:07) (ahora se expanden en su sitio al tocarlos), sin cambiar su valor con el toque que los expande (14:26), y “collapse themselves when I’m not interacting with them” (14:41); en los sliders es una opción, ya que “sliders have the option to expand when presented small” (15:36).4 Los menús también se adaptan: “when using touch, the menu shows slightly larger rows to help make selection easier” (11:23), y lo mismo pueden hacer las vistas transitorias: “views in your app that are briefly presented, such as popovers or custom menus, can show slightly altered layouts depending on the input used to invoke them” (11:29) (las vistas de tu app que se presentan brevemente, como los popovers o los menús propios, pueden mostrar diseños ligeramente distintos según la entrada que las abrió).4
El hover desaparece
“Direct touches don’t have an equivalent to mouseMoved events” (10:38) (los toques directos no tienen equivalente a mouseMoved), así que todo lo que se revela al pasar el puntero necesita una decisión.3 Las reglas de la charla de AppKit: “don’t change your app experience to permanently show hidden controls” (10:49), “Static data like tooltips shouldn’t be revealed on touch” (10:53), y “for hidden essential controls, install a touch-only click gesture recognizer to temporarily show the element on a touch tap” (10:57) (no muestres los controles ocultos de forma permanente, no reveles tooltips al tocar y, para los controles ocultos esenciales, instala un reconocedor de clic solo táctil que los muestre temporalmente).3 La nota técnica confirma que la ruta del puntero no cambia: “Hovering via mouseMoved(with:) is still managed with NSTrackingArea.”6
Las reglas de la charla de diseño son las mismas vistas desde el usuario. “hover actions that are purely showing information, like tooltips, are not required to work with touch” (11:53); las acciones que ya son fáciles con el toque no necesitan ninguna ayuda, como los botones de desplazamiento de un carrusel, que “remain hidden during a touch interaction” (12:22) porque “horizontal scroll is always possible via touch” (12:19); “only the most important hover actions relevant to that content should reveal themselves” (12:30) (solo deben revelarse las acciones de hover más importantes), con Safari mostrando exactamente dos cuando se toca una página (12:36); y “actions that appear on hover be duplicated elsewhere in your UI” (13:05) (las acciones que aparecen con el hover deben repetirse en otro lugar de la UI), con el botón de compartir de Recordatorios viviendo en el menú contextual de la fila cuando se usa el toque (13:20).4
Desplazamiento, pulsación larga, arrastre, texto
El desplazamiento es con un dedo en la pantalla y con dos en el trackpad (4:39).4 Cuando un dedo debe dibujar en vez de desplazar, la charla de AppKit configura “the decorating view’s enclosing scroll view to require two touches minimum for touch scrolling” (6:40) (que la vista de desplazamiento contenedora exija al menos dos toques); la propiedad es NSScrollView.minimumNumberOfTouchesForScrolling, macOS 27.0, con maximumNumberOfTouchesForScrolling, isTouchScrollingEnabled y scrollGestureForRelationships al lado.37 Un reconocedor que debe ceder ante un desplazamiento configura isCancellableByScrollGesture; “NSScrollView now supports pull-to-refresh functionality” (NSScrollView ahora admite deslizar para actualizar) mediante NSRefreshController; y en NSPanGestureRecognizer el par minimumNumberOfTouches y maximumNumberOfTouches “replace numberOfTouchesRequired”, que queda obsoleta en 27.0.67
Una pulsación larga es el toque de la Mac tanto para arrastrar como para el menú contextual, y AppKit arbitra. “When a draggable item is long pressed, it should hint at its draggability with a lift animation. To get the drag-and-drop lift preview, use the existing drag-and-drop delegate APIs on NSTableView, NSOutlineView, and NSCollectionView” (9:49) (cuando se mantiene presionado un elemento arrastrable, debe insinuar que se puede arrastrar con una animación de elevación; para obtener la vista previa de elevación, usa las API delegadas de arrastrar y soltar que ya existen en NSTableView, NSOutlineView y NSCollectionView).3 Para los menús, “Use the menu property on NSView or override menu(for:). AppKit will detect this and automatically install the appropriate gesture recognizers, which include a control-tap gesture recognizer as an accelerator” (10:11), y “When using both this menu API and the container view drag-and-drop delegate APIs, AppKit will coordinate when a long press becomes a drag-and-drop operation or a context menu one, even allowing the user to switch between them” (10:25) (cuando usas a la vez esta API de menú y las API delegadas de arrastrar y soltar de la vista contenedora, AppKit coordina cuándo una pulsación larga se convierte en una operación de arrastrar y soltar o en un menú contextual, e incluso permite al usuario pasar de uno a otro).3 La charla de diseño muestra la vista del usuario: la foto “scales up under my finger” (3:50), su menú contextual aparece al lado (3:58) y arrastrar cierra el menú (4:05); Shift y Option siguen funcionando al arrastrar con el toque (4:13).4 Para vistas propias, beginDraggingSession(items:gesture:source:) inicia “a drag from a gesture recognizer”, nuevo en 27.0.67
El texto es el punto débil. La única frase de la nota técnica es “NSTextSelectionManager allows custom text engines to support standard text gestures” (permite que los motores de texto propios admitan los gestos de texto estándar), y la clase está documentada como macOS 27.0 con el resumen “An object that coordinates text selection behavior for custom text views.”67 El encabezado completa el contrato (análisis del autor): la clase “provides a centralized way to manage text selection interactions using a set of gesture recognizers”, con un modo de interacción que puede ser editable, solo seleccionable o no interactivo, un delegado que guarda la selección y una fuente de datos de diseño.7 Ninguna de las charlas cubre puntos de inserción, tiradores de selección ni un menú de edición con el toque; la guía de selección de la charla de diseño trata de elementos, donde “on macOS we recommend to allow modeless selection through click and tap” (2:42) (en macOS recomendamos permitir la selección sin modos mediante clic y toque), un toque para seleccionar y doble toque para abrir (3:10).4
Gestos del sistema, y el interruptor que no está documentado
macOS reserva un conjunto de gestos de varios dedos en la pantalla, “controlled by macOS and are therefore not available to any app running” (8:05) (controlados por macOS y por eso no disponibles para ninguna app): tres dedos hacia arriba para Mission Control y hacia abajo para App Exposé (8:13), pellizcar con el pulgar y tres dedos para mostrar las apps y separarlos para ver el escritorio (8:22), tres dedos a izquierda o derecha entre espacios (8:32), deslizar desde los bordes superior e inferior para una barra de menús y un Dock ocultos (8:37), deslizar sobre la Dynamic Island para invocar a Siri (8:46) y deslizar desde los bordes para el Centro de notificaciones y el Centro de control (8:51).4
La charla de AppKit choca con el conflicto usando tres sliders: “if I try to control three or more sliders in the same direction at the same time, I get the system gesture instead” (8:17) (si muevo tres o más sliders en la misma dirección a la vez, recibo el gesto del sistema), y muestra el interruptor: “I can control system gesture availability at the window level with the disablesDirectTouchSystemGestures property on NSWindow. SwiftUI and Mac Catalyst also have similar API on UIViewController and View” (8:25), con la advertencia “Only disable system gestures if the interaction capabilities they open up are critical for the window” (8:42) (desactívalos solo si las interacciones que habilitan son críticas para la ventana).3 El listado de código de la página de la charla nombra los tres: disablesDirectTouchSystemGestures en NSWindow, prefersDirectTouchSystemGesturesDisabled en UIViewController y directTouchSystemGesturesDisabled() en un View de SwiftUI.3 Ninguno de los tres está en la documentación de Apple el 28 de octubre; los endpoints JSON devuelven 404 y los símbolos no aparecen en los índices de AppKit, UIKit ni SwiftUI.7 Mi lectura, no una afirmación de Apple: son la señal más clara de que el SDK que las charlas dan por hecho es el que figura como “Coming soon”.
SwiftUI y Mac Catalyst
SwiftUI recibe un tipo nuevo: “if you have a specialized need to distinguish between mouse and direct touch input, you can use the new GestureInputKinds gesture modifier API” (0:43) (si tienes una necesidad especializada de distinguir entre la entrada del mouse y el toque directo, puedes usar la nueva API de modificador de gestos GestureInputKinds).3 GestureInputKinds está documentado en las siete plataformas en 27.0, con .directTouch (“A person is touching content directly”), .pointer (“A person is pressing a mouse or a trackpad button while the pointer is pointing at content”), .indirectTouch, .pencil y .all, y parámetros inputKinds: en onTapGesture, onLongPressGesture y los inicializadores de TapGesture, SpatialTapGesture, LongPressGesture, DragGesture, MagnifyGesture y RotateGesture.7 La frase de la nota técnica es “Use GestureInputKinds to limit gestures to specific types of input in SwiftUI.”6
Mac Catalyst usa lo que UIKit tiene desde iOS 9: la charla dice “UITouch.touchType and UIGestureRecognizer’s allowedTouchTypes” (0:59); la propiedad documentada es UITouch.type, con el enum UITouch.TouchType, y allowedTouchTypes está en UIGestureRecognizer desde Mac Catalyst 13.1.37 La redacción de la charla es un desliz, no una API nueva.
Live Activities en la Mac, por delante de la documentación
La tercera charla es corta y hace una afirmación grande. “The Dynamic Island has come to the Mac. To fully take advantage of its capabilities, Mac apps now support native Live Activities” (0:05) (la Dynamic Island llegó a la Mac; para aprovechar al máximo sus capacidades, las apps de Mac ahora admiten Live Activities nativas), y “now in macOS Golden Gate, applications running on the Mac can create Live Activities directly” (0:57).5 “Universal applications with existing Live Activities will work on the Mac with no code change, and native macOS apps can create Live Activities directly through the Live Activities API” (1:03) (las apps universales con Live Activities existentes funcionarán en la Mac sin cambios de código, y las apps nativas de macOS pueden crear Live Activities directamente mediante la API de Live Activities).5 La ubicación: “On a Mac with Dynamic Island, Live Activities blend in seamlessly into the top edge of the device. On other devices and displays, they are shown in the menu bar” (1:14) (en una Mac con Dynamic Island se integran en el borde superior; en otros dispositivos y pantallas, en la barra de menús).5 El código es el de iOS: el modelo de datos en ActivityAttributes (2:36), las presentaciones compacta y mínima en ActivityConfiguration con el view builder de la Dynamic Island (3:24), la única presentación propia de la Mac, “The menu bar expanded Live Activity view is created along with the ActivityConfiguration as a simple view” (3:52), mientras que “Expanded Live Activities in the Dynamic Island are defined with the Dynamic Island view builder” (4:02), “This same code works on iOS and macOS” (4:30), inicios inmediatos, programados o por push (4:40), integración “with existing backgrounding technologies on the Mac, like background tasks and user agents” (4:54), acciones mediante App Intents (5:56) y “If you have an iOS activity, there’s no code to port” (7:09) (si ya tienes una actividad de iOS, no hay código que portar).5 Dos reglas pasan tal cual desde iOS: “Only a single Live Activity can be expanded at a time” (3:12), y “An activity is only expanded when interacted with or if explicitly triggered through an alert request” (3:06) (solo se expande una a la vez, y únicamente al interactuar con ella o si se activa explícitamente mediante una solicitud de alerta).5
La documentación de Apple todavía no lo dice. El resumen de la página del framework ActivityKit nombra “the Mac”, pero su Overview dice “On Mac, it appears in the Menu bar”, su lista de plataformas es iOS, iPadOS y Mac Catalyst 16.1, y Activity, ActivityAttributes, ActivityConfiguration, DynamicIsland y la clave NSSupportsLiveActivities no listan ninguna plataforma macOS.87 La página de Live Activities de las HIG, cuyo registro de cambios termina el 13 de octubre, todavía describe solo la ruta del iPhone emparejado: “Active Live Activities automatically appear in the Menu bar of a paired Mac”, “Clicking the Live Activity launches iPhone Mirroring to display your app” y, bajo “macOS dimensions”, “Use the provided iOS dimensions.”10 Los SDK coinciden con la documentación, no con la charla: en el SDK de macOS 27.0 dentro de Xcode 27.1 y en el SDK de macOS 27.2 dentro de la beta de Xcode 27.2 (27B5019j), la interfaz de macOS de ActivityKit marca ActivityAttributes, Activity y cada request y update como @available(macOS, unavailable), según revisé en esta Mac (análisis del autor). Así que la frase correcta para un plan es la estrecha: la charla dice que la capacidad existe en macOS Golden Gate, y ni la documentación ni ninguno de los dos SDK que revisé permiten construirla todavía. El post sobre la máquina de estados muestra una implementación en iOS del modelo compartido de inicio, actualización y fin; la duración, el descarte y los límites en segundo plano propios de la Mac no están todavía en ninguna fuente.
Diseño: macOS no cambia
Las reglas de cierre de la charla de diseño son lo bastante cortas para conservarlas enteras. “Avoid redesigning your app just to support touch. Your app on a Mac that supports touch should have no visual distinction from your app on a Mac that doesn’t” (16:05) (evita rediseñar tu app solo para admitir el toque; en una Mac con toque no debe verse distinta que en una Mac sin él). “Use gestures to navigate your app and directly manipulate your content” (16:14). “Use 36 points as a touch target on macOS, and use Apple frameworks to get touch-optimized layouts and expandable controls” (16:18). “Most apps will work great with touch right away” (16:28). “Keep keyboard and mouse as a primary input” (16:31) (mantén el teclado y el mouse como entrada principal).4
La única regla espacial trata de las manos, no de las posturas. “The edges of the display are easy to touch by grabbing the side of the display with my hand” (6:17), así que “The left and right side of my app window are therefore best used to show rich controls and dense UI, such as inspectors and navigation sidebars” (6:29), mientras que “the center of the display is best used for coarse, imprecise and big gestures” (6:46) (los bordes de la pantalla son fáciles de tocar sujetando el costado con la mano, así que los lados izquierdo y derecho de la ventana conviene usarlos para controles ricos e interfaz densa, como inspectores y barras laterales de navegación; el centro de la pantalla conviene usarlo para gestos bruscos, imprecisos y grandes).4 Los gestos propios tienen tres restricciones: “your gestures should work with touch and trackpad and possibly Magic Mouse” (7:00), “Avoid adding gestures that only work with touch” (7:05), y “The action your gesture does should be duplicated elsewhere in the UI, for example in a menu” (7:37) (la acción del gesto debe repetirse en otro lugar de la UI, por ejemplo en un menú).4 La charla también permite lo que la Mac nunca tuvo: “macOS now allows multiple touch gestures at the same time” (5:30), con los dos sliders de Logic bajo dos dedos como ejemplo (5:45).4 Es el lado del usuario de la propiedad de exclusividad de más arriba: el valor por defecto de AppKit mantiene una sola jerarquía de vistas a la vez, y .notExclusive es la forma en que una app abre el resto.36
Pruebas hoy: Sidecar, y el SDK que no está
No necesitas la laptop. “With the latest macOS beta and developer tools, all the touch features of the Mac with Touch Display are available with an iPad connected to your Mac with Sidecar” (11:59) (con la beta más reciente de macOS y las herramientas de desarrollo, todas las funciones táctiles de la Mac con pantalla táctil están disponibles con un iPad conectado a tu Mac mediante Sidecar), y “The fastest way to get started with touch on Mac is with the Sidecar tools you already own” (12:09).3 La nota técnica exige que el iPad tenga iPadOS 27 y agrega una advertencia sobre la comprobación de capacidad (NSScreen.touchCapabilities, un option set con un bit .multiTouch): en macOS 27 la comprobación “returns true for all displays when a touch-capable Sidecar display is connected, not just for the Sidecar display” (devuelve true para todas las pantallas cuando hay conectada una pantalla Sidecar con capacidad táctil, no solo para la pantalla de Sidecar), con el consejo de que “it’s better to handle events regardless of input source and decide on an alternate presentation based on the interaction type, if needed.”67
La auditoría de la charla, en su propio orden: “start testing your application with touch on macOS with Sidecar. Then audit your code for mouseDown(with:) overrides. Determine if you can use control events or delegate methods instead, or if you need to add your own touch-specific gesture recognizers. Look for areas that have small hit targets and expand them for touch. And finally, add an affordance or use a tap to reveal essential hidden UI” (12:24).3 También hay un skill: “there’s a gesture modernization skill that has an understanding of the features and changes I’ve talked about” (12:16) (hay un skill de modernización de gestos que conoce las funciones y los cambios de los que hablé); el mosaico de Xcode de la página de aterrizaje lleva un comentario de marcador, TK skill, y ninguna fuente lo nombra.23
Lo que contienen los SDK publicados, análisis del autor a partir de los encabezados y las interfaces Swift de esta Mac: el SDK de macOS 27.0 dentro de Xcode 27.1 (27A9275) declara NSScreen.TouchCapabilities, los cinco casos nuevos de eventos de NSControl, las propiedades táctiles de NSScrollView, NSRefreshController, beginDraggingSession(items:gesture:source:) y exclusiveGestureBehavior, todos API_AVAILABLE(macos(27.0)), y la interfaz de macOS de SwiftUICore, que SwiftUI reexporta, declara GestureInputKinds. Los tres interruptores de gestos del sistema no están ni en ese SDK ni en el SDK de macOS 27.2 dentro de la beta de Xcode 27.2 (27B5019j), ni en los encabezados de AppKit, ni en la interfaz de SwiftUI, ni en los encabezados de UIKit para Mac Catalyst, y la interfaz de macOS de ActivityKit marca su API como no disponible en ambos.78
Esos son los dos SDK que revisé; la release candidate de Xcode 27.2 (27B48), que el feed de versiones de Apple fecha el 19 de octubre, es más nueva que esa beta y no la revisé, así que las ausencias valen para los SDK nombrados y no más allá.11
Qué instalar para probar hoy, sin que yo lo haya probado: macOS 27.2 (26B123, publicado el 26 de octubre según el feed) y la release candidate de Xcode 27.2, con un iPad con iPadOS 27 por Sidecar; la nota técnica describe el toque por Sidecar como funcional en macOS 27, y el feed no lista ninguna beta de macOS 27.3 el 28 de octubre.611 Una advertencia de las propias notas de la release candidate: “macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target” (los SDK de macOS, watchOS, tvOS y visionOS de Xcode 27.2 reportan por error 27.1 como deployment target válido), y “Mac Catalyst builds with a 27.1 or 27.2 deployment target might be unable to use newly introduced API”, así que no elijas 27.1 como deployment target de macOS (el feed de versiones lista macOS 27.0.1 y 27.2 y ningún macOS 27.1), y si un target de Mac Catalyst en 27.1 o 27.2 no ve una API nueva, léelo como este problema conocido y no como un símbolo faltante.11
Lo que no está, entonces: la beta de Xcode 27.3 que promete la página de aterrizaje, el artículo de AppKit que enlaza, los tres símbolos de gestos del sistema y un ActivityKit disponible en macOS (ausentes de los dos SDK revisados, sin verificar en la release candidate de 27.2), y cualquier declaración sobre un simulador. Las notas de la release candidate de Xcode 27.2 mencionan el toque una sola vez, como una corrección de Device Hub para la entrada que dejaba de funcionar “after a period of inactivity” (tras un periodo de inactividad), y las notas de macOS 27.2 no tienen ninguna entrada sobre toque, gestos o Live Activities.11 Las API de toque salieron con Xcode 27.1, las reglas están publicadas, y la página de aterrizaje marca lo que sigue como “Coming soon”.
Una auditoría táctil para cualquier app de Mac
Análisis del autor, no una guía de Apple: los cuatro pasos de la charla, en orden, como lista de verificación. Todavía no la respalda ninguna prueba en ejecución.
- Sidecar con un iPad con iPadOS 27, sobre el macOS y el Xcode más nuevos (macOS 27.2 y la release candidate de Xcode 27.2), y cada pantalla de la app tocada antes de cambiar nada.
- Una búsqueda de sobrescrituras de
mouseDown(with:)y de buclesnextEvent(matching:), cada una asignada a eventos de control, a un método delegado o a un reconocedor de gestos. - Una revisión de los controles pequeños y las áreas de toque, con el área táctil ampliada donde ayude y sin cambios de diseño; la charla permite un control más pequeño siempre que el toque siga funcionando en él.
- Una lista de todo lo que aparece al pasar el puntero, con una decisión por elemento: un tooltip queda solo para el mouse; una acción que ya es fácil con el toque no necesita nada; un control esencial recibe un reconocedor de clic solo táctil y un lugar en otra parte de la UI, como un menú contextual.
Lo único que la auditoría no va a producir es un rediseño, porque la primera regla de la charla de diseño es que no debe haber distinción visual; el único diseño que puede cambiar según la entrada es uno transitorio, un popover o un menú propio.
Lo que Apple no ha dicho
Cada uno de estos puntos es una pregunta que las fuentes dejan abierta, contrastada con el comunicado, la página de aterrizaje, las tres charlas, la nota técnica, la página de especificaciones, las notas de la release candidate de Xcode 27.2 y de macOS 27.2, y las cuatro páginas de las HIG.
- Qué versión puntual de macOS trae el toque en la pantalla integrada, y qué SDK trae los tres símbolos no documentados. El comunicado dice “macOS 27” y nombra macOS 27.2 solo en su nota al pie sobre Siri AI; la página de aterrizaje dice “Xcode 27.3 beta”, “Coming soon”.
- Si un binario compilado con un SDK anterior recibe el mismo comportamiento táctil que uno recompilado con el SDK de macOS 27. La charla dice “all apps”; la nota técnica vincula al SDK nuevo solo el cambio de
location(in:). - Apple Pencil o presión en la pantalla, y si el cristal detecta un dedo antes de que toque. Las charlas abordan la ausencia de un estado de hover como el del mouse; ninguna fuente menciona un lápiz, presión ni detección de proximidad, y
GestureInputKinds.pencilfigura para macOS 27.0 como cualquier otro miembro, mientras que ninguna fuente dice que la pantalla detecte un lápiz.7 - El toque en pantallas externas o con la tapa cerrada, y si los usuarios pueden desactivar el toque.
- La edición de texto con el toque: puntos de inserción, tiradores, una lupa y el menú de edición.
- La accesibilidad con la pantalla táctil. La página de especificaciones lista AssistiveTouch y Adaptaciones táctiles entre las funciones de la laptop y no dice si son nuevas en la Mac.9
- Cómo recibe toques en la pantalla de la Mac una app “Designed for iPad”, y si eso difiere de Mac Catalyst.
- Una ruta en el simulador o en Device Hub para el toque en la Mac sin un iPad.
- El contenido web: si WKWebView y Safari entregan eventos táctiles o de puntero a las páginas.
- Cómo se relacionan las ventanas y el contenido a pantalla completa con la Dynamic Island, y qué API de área segura la reporta.
- Los detalles de Live Activities en macOS: la versión puntual y el SDK, si se requiere
NSSupportsLiveActivities, cómo funcionan push-to-start y el registro en APNs en la Mac, y las dimensiones de una actividad nativa de Mac.
El calendario
- 28 de octubre: preventa en 30 países y regiones; la página para desarrolladores y tres charlas; la nota técnica está publicada desde el 8 de junio.126
- 6 de noviembre: la laptop llega a los clientes y a las tiendas.1
- 18 de noviembre, de 9 a 10 a.m. PT, y 19 de noviembre, de 6 a 7 p.m. PT: Group Labs de Touch on Mac, en línea, con ingenieros y diseñadores de Apple.2
- “Coming soon”: la beta de Xcode 27.3, los recursos de documentación, los recursos de diseño.2
- Este noviembre: la actualización de Apple Creator Studio cuyas funciones táctiles de Logic Pro y Final Cut Pro describe el comunicado; las apps de terceros que nombra “will be available later this year” (estarán disponibles más adelante este año).1
Puntos clave
Para desarrolladores de AppKit: los controles estándar ya son nativos para el toque; tu código propio de mouseDown(with:) se emula hasta que pases a eventos de control o a reconocedores de gestos, y un NSPanGestureRecognizer solo táctil con buttonMask = 0 y allowedTouchTypes = .direct es la ruta para una versión menor que recomienda la charla; las API están en el SDK de macOS 27.0 que ya tienes.37
Para desarrolladores de SwiftUI y Catalyst: tus gestos ya funcionan; GestureInputKinds es el único tipo nuevo de SwiftUI, y la respuesta de Catalyst es UITouch.type y allowedTouchTypes.37
Para diseñadores: 36 puntos, invisibles; nada de rediseños; las acciones de hover esenciales, alcanzables con el toque y también ubicadas en otro lugar de la UI, como un menú contextual, con los tooltips exentos; la UI densa en los bordes y los gestos amplios en el centro.4
Para planificar: prueba con Sidecar ya; antes de construir algo que desactive los gestos del sistema o cree una Live Activity nativa de Mac, confirma que el SDK instalado declara esas API, porque los dos SDK inspeccionados aquí no lo hacen y la release candidate de Xcode 27.2 no está verificada; el próximo SDK que Apple ha prometido es la beta de Xcode 27.3.278
Preguntas frecuentes
¿Mi app de Mac actual funciona con el toque?
Apple dice que sí para la mayoría de las apps: “many existing apps work with Touch right away, because macOS automatically translates touches into clicks” (muchas apps existentes funcionan con Touch de inmediato porque macOS traduce automáticamente los toques en clics), y la charla de AppKit dice que los componentes estándar de AppKit, SwiftUI y Mac Catalyst y los gestos existentes “just work”.13 El código propio de seguimiento del mouse se emula hasta que pase a eventos de control o a reconocedores de gestos; un framework de UI que no es de Apple recibe una capa de emulación genérica que NSIsTouchNative desactiva cuando la app ya maneja el toque por su cuenta.36
¿Cómo recibo un toque directo en AppKit?
Con un reconocedor de gestos. La charla dice que “gesture recognizers are the only way to get direct touches on macOS”, y la nota técnica dice que los eventos táctiles no pasan por la cadena de respondedores, los monitores de eventos, NSApp ni sendEvent(_:).36 Un reconocedor solo táctil configura buttonMask en 0 y allowedTouchTypes en .direct.3
¿Cuál es el objetivo táctil en macOS?
36 puntos, “the same physical size on display as iOS’s 44 points” (el mismo tamaño físico en pantalla que los 44 puntos de iOS). Los controles del framework ya lo cumplen sin cambiar de tamaño; en las vistas propias, amplía el área de toque en lugar de la vista.43
¿Cómo pruebo el toque sin la nueva MacBook Pro?
Conecta un iPad con iPadOS 27 por Sidecar. La condición de la charla es “With the latest macOS beta and developer tools” (11:59), y no ha salido ninguna beta de macOS 27.3, así que la configuración que yo probaría es macOS 27.2 con la release candidate de Xcode 27.2, sin haberla probado.3611
¿Las API de toque ya están en el SDK?
Sí, para todo lo que las charlas demuestran salvo los interruptores de gestos del sistema y las Live Activities nativas de Mac, que no aparecen en los dos SDK inspeccionados aquí (la release candidate de Xcode 27.2 no se inspeccionó). El SDK de macOS 27.0 dentro de Xcode 27.1 declara NSScreen.TouchCapabilities, los nuevos casos de eventos de NSControl, las propiedades táctiles de NSScrollView, NSRefreshController, exclusiveGestureBehavior y la sesión de arrastre basada en gestos, y la interfaz de SwiftUICore declara GestureInputKinds; la documentación de Apple los lista como macOS 27.0 sin marca de beta.7 Los interruptores de gestos del sistema para la ventana, el controlador de vista y la vista no están ni en la documentación ni en los SDK de Xcode 27.1 o de la beta de 27.2, ActivityKit marca su API como no disponible en macOS en ambos, y la página de aterrizaje marca la beta de Xcode 27.3 como “Coming soon”.278
¿Una app de Mac puede crear Live Activities?
La charla dice que sí en macOS Golden Gate, con el mismo código de ActivityKit y WidgetKit que en iOS y una presentación en la barra de menús en las Mac sin Dynamic Island.5 La documentación de ActivityKit y las HIG todavía no listan macOS como plataforma para actividades creadas por apps, describen la ruta de la barra de menús con el iPhone emparejado, y la interfaz de ActivityKit en los SDK de Xcode 27.1 y de la beta de 27.2 marca la API como no disponible en macOS.108
¿De dónde salen los datos de este post?
Del comunicado, la noticia para desarrolladores y la página de aterrizaje, las pistas de subtítulos en inglés de los tres Tech Talks con el primer cue de cada cita entre paréntesis, la nota técnica de junio, el JSON de la documentación de Apple de cada símbolo nombrado, la página de especificaciones, las notas de versión de la release candidate de Xcode 27.2 y de macOS 27.2, y las cuatro páginas de las HIG, todo consultado el 28 de octubre de 2026, más los encabezados y las interfaces Swift de los SDK de macOS 27.0 y de la beta de 27.2 en mi Mac, que son análisis del autor. La cobertura de prensa no es una fuente.
Fuentes
-
Apple Newsroom, Apple unveils groundbreaking MacBook Pro with PROLED XDR Display, 28 de octubre de 2026, visto por primera vez en el feed de Newsroom a las 10:09 a.m. PT (la marca
updateddel feed dice 17:09:28Z). Secciones “Touch Arrives on Mac”, “Say Hello to the Dynamic Island on Mac” y “macOS 27 Golden Gate”; precios y disponibilidad; nota al pie 4 sobre apps de terceros. ↩↩↩↩↩↩↩↩ -
Apple Developer, Say hello to Touch on Mac, 28 de octubre de 2026, y Get ready for Touch on Mac, consultada el 28 de octubre de 2026 a las 11:49 a.m. PT: las tres charlas, “Touch on Mac Group Labs” el 18 de noviembre, de 9 a 10 a.m. PT, y el 19 de noviembre, de 6 a 7 p.m. PT, y los mosaicos “Xcode 27.3 beta”, “Documentation resources” y “Design resources”, cada uno marcado “Coming soon”, con sus enlaces guardados en comentarios HTML. ↩↩↩↩↩↩↩↩↩↩↩↩
-
Apple Developer, Tech Talk Bring Touch to your Mac app, 13:19, Raleigh Ledet, 28 de octubre de 2026. Las citas vienen de la pista de subtítulos en inglés; el tiempo entre paréntesis es el primer cue del fragmento citado. Entre los listados de código de la página de la charla: “Use NSControl events to detect tracking” (2:24), “Refactored tracking functions” (4:11), “Add a touch-only pan gesture recognizer” (4:24), “Pan gesture recognizer action” (4:52), “Require two touches for scrolling” (6:40), “Allow simultaneous slider interaction” (7:48), “Disable system gestures” (8:25), “Declare touch-native support in Info.plist” (11:47); los tres listados reproducidos en el post están copiados textualmente de la página. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Apple Developer, Tech Talk Design for touch on Mac, 16:52, Cas Lemmens, 28 de octubre de 2026. Citas de la pista de subtítulos en inglés, primer cue entre paréntesis. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
Apple Developer, Tech Talk Bring Live Activities to Mac, 7:40, Jonathan Tilley, 28 de octubre de 2026. Citas de la pista de subtítulos en inglés, primer cue entre paréntesis. ↩↩↩↩↩↩↩
-
Documentación para desarrolladores de Apple, TN3212: Adopting gesture recognizers for Sidecar touch support, historial de revisiones “2026-06-08 First published”, consultada el 28 de octubre de 2026 al mediodía PT. Secciones citadas: Overview, “Understand how gesture recognizers gather events”, “Handle Sidecar touch input”, “Update your event-handling code”, “Implement custom gesture recognizers”, “Handle tracking loop compatibility”, “Update to gesture recognizer behavior”, “Support third-party UI frameworks”, “Explore updated APIs in macOS 27”, “Detect touch capability”, “Handle control events”, “Configure scroll behavior”, “Work with text and dragging” y “Handle deprecations and behavior changes”. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
JSON de la documentación de Apple (
developer.apple.com/tutorials/data/documentation/<path>.json, los datos detrás de las páginas enlazadas aquí), consultado el 28 de octubre de 2026, de las 11:55 a.m. a las 12:05 p.m. PT. Listados como macOS 27.0 sin marca de beta:NSScreen.TouchCapabilitiesy.multiTouch,NSControl.Events.trackingRepeated,.valueChanged,.primaryActionTriggered,.menuActionTriggeredy.applicationReserved,NSScrollView.isTouchScrollingEnabled,.minimumNumberOfTouchesForScrolling,.maximumNumberOfTouchesForScrolling,.scrollGestureForRelationshipsy.refreshController,NSRefreshController,NSPanGestureRecognizer.minimumNumberOfTouchesy.maximumNumberOfTouches,NSGestureRecognizer.isCancellableByScrollGesture,NSView.exclusiveGestureBehavioryExclusiveGestureBehavior,NSView.beginDraggingSession(items:gesture:source:),NSTextSelectionManager,NSIsTouchNative(su página: “Most AppKit apps don’t need this key. It’s primarily intended for apps that embed a non-AppKit rendering or input framework and implement their own touch-handling pipeline.”),NSViewGestureRecognizerIsExclusive, yGestureInputKindscon sus miembros (las siete plataformas en 27.0). Más antiguos:NSGestureRecognizery sus subclases concretas (macOS 10.10),allowedTouchTypes(10.12.2), los casos de seguimiento deNSControl.Events(11.0),UITouch.typeyUIGestureRecognizer.allowedTouchTypes(iOS 9.0, Mac Catalyst 13.1);numberOfTouchesRequiredobsoleta en 27.0. No encontrados (HTTP 404, ausentes de los índices de los frameworks):NSWindow.disablesDirectTouchSystemGestures,UIViewController.prefersDirectTouchSystemGesturesDisabled,directTouchSystemGesturesDisabled()de SwiftUI y el artículo “Adopting gesture recognizers in your app”. Revisión del SDK el 28 de octubre de 2026 (análisis del autor), enMacOSX27.0.sdkdentro de Xcode 27.1 (27A9275): la línea 583 deNSView.hdice@property NSViewExclusiveGestureBehavior exclusiveGestureBehavior API_AVAILABLE(macos(27.0));bajo el comentario “Defaults to.inherit”;NSScreen.hdeclaraNSScreen.TouchCapabilitiesytouchCapabilities;NSControl.hdeclaraNSControlEventTrackingRepeated,ValueChanged,PrimaryActionTriggered,MenuActionTriggeredyApplicationReserved;NSScrollView.hdeclaratouchScrollingEnabled,minimumNumberOfTouchesForScrolling,maximumNumberOfTouchesForScrolling(línea 148),scrollGestureForRelationshipsyrefreshController;NSRefreshController.hdeclara la clase;NSPanGestureRecognizer.hdeclaraminimumNumberOfTouchesymaximumNumberOfTouchesy marcanumberOfTouchesRequiredcomo obsoleta con el reemplazominimumNumberOfTouches;NSGestureRecognizer.hdeclaracancellableByScrollGesture;NSTextSelectionManager.hdeclara la clase y suMode, con el comentario “provides a centralized way to manage text selection interactions using a set of gesture recognizers”;NSView.hdeclarabeginDraggingSession(items:gesture:source:); todosAPI_AVAILABLE(macos(27.0)).SwiftUICore.swiftmodule/arm64e-apple-macos.swiftinterfacedeclaraGestureInputKindsen la línea 25274 bajo@available(anyAppleOS 27.0, *), y la interfaz de SwiftUI, que lo reexporta, declara los parámetrosinputKinds:enonTapGesture,onLongPressGesture(línea 22962) y los inicializadores deSpatialTapGesture,LongPressGesture,DragGesture,MagnifyGestureyRotateGesture, mientras queTapGesture.init(count:inputKinds:)está en la interfaz de SwiftUICore (línea 18305).DirectTouchSystemGesturesno aparece en ningún encabezado de AppKit, en ninguna interfaz Swift de macOS de SwiftUI o SwiftUICore ni en ningún encabezado de UIKit para Mac Catalyst, ni en ese SDK ni enMacOSX27.2.sdkdentro de la beta de Xcode 27.2 (27B5019j). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Documentación para desarrolladores de Apple, ActivityKit, consultada el 28 de octubre de 2026: resumen “Share live updates from your app as Live Activities on iPhone, iPad, Apple Watch, and the Mac”, Overview “On Mac, it appears in the Menu bar”, plataformas iOS, iPadOS y Mac Catalyst 16.1;
Activity,ActivityAttributes,ActivityContent(iOS y iPadOS 16.1 o 16.2),ActivityConfigurationyDynamicIslandde WidgetKit (iOS y iPadOS 16.1), yNSSupportsLiveActivities(iOS y iPadOS 16.1), ninguno con macOS. Displaying live data with Live Activities, resumen: “Display up-to-date data and offer quick interactions in the Dynamic Island, on the Lock Screen, in CarPlay, and on a paired Mac or Apple Watch.” Revisión del SDK (análisis del autor):ActivityKit.swiftmodule/arm64e-apple-macos.swiftinterfaceenMacOSX27.2.sdk(beta de Xcode 27.2, 27B5019j) lleva@available(macOS, unavailable)enActivityAttributes,Activity, cada sobrecarga derequestyupdate; elarm64e-apple-macos.swiftinterfacedeMacOSX27.0.sdk(Xcode 27.1, 27A9275) lleva las mismas marcas. ↩↩↩↩↩↩↩ -
Apple, MacBook Pro with PROLED XDR Display Technical Specifications, consultada el 28 de octubre de 2026 a las 11:57 a.m. PT: “14.2-inch (diagonal) tandem OLED display” a “3024-by-1986 native resolution at 254 pixels per inch”, “16.3-inch (diagonal) tandem OLED display” a “3472-by-2266 native resolution at 254 pixels per inch”, las líneas de Display “Touch”, “Multi-Touch gesture support” y “Dynamic Island”, y “ProMotion technology with adaptive refresh rates from 10Hz to 120Hz”. ↩↩
-
Apple Developer, Human Interface Guidelines, Gestures (registro de cambios “September 9, 2024”), Pointing devices (“June 21, 2023”), Designing for macOS y Live Activities (“October 13, 2026 | Added guidance for limited width layouts, and updated supported platforms and specifications.”), todas consultadas el 28 de octubre de 2026; ninguna menciona el toque en la pantalla de la Mac. Live Activities, Platform considerations, macOS: “Active Live Activities automatically appear in the Menu bar of a paired Mac using the compact, minimal, and expanded presentations”, “Clicking the Live Activity launches iPhone Mirroring to display your app” y, bajo el encabezado “macOS dimensions”, “Use the provided iOS dimensions.” ↩↩↩
-
Documentación para desarrolladores de Apple, Xcode 27.2 RC Release Notes, consultadas el 28 de octubre de 2026: “Xcode 27.2 RC includes Swift 6.4 and SDKs for iOS 27.2, iPadOS 27.2, tvOS 27.2, watchOS 27.2, macOS 27.2, and visionOS 27.2”; Device Hub, Resolved Issues: “Fixed: Device Hub stopped sending touch and button input to a connected device after a period of inactivity. (182695157) (FB23873443).”; Known Issues: “macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target. Builds and other functionality might have unexpected behavior if this deployment target is used. Mac Catalyst builds with a 27.1 or 27.2 deployment target might be unable to use newly introduced API.” macOS 27.2 Golden Gate Release Notes, consultadas el mismo día: ninguna entrada menciona el toque, los gestos, Sidecar ni Live Activities. Apple Developer, Releases, feed RSS consultado el 28 de octubre de 2026: “Xcode 27.2 RC (27B48)” con fecha Mon, 19 Oct 2026 10:00:00 PDT, “macOS 27.2 (26B123)” con fecha Mon, 26 Oct 2026 10:00:00 PDT, y ningún elemento que nombre macOS 27.3 o Xcode 27.3. ↩↩↩↩↩↩