Touch on Mac dla programistów: 36 punktów, gesty, Sidecar

Co Touch na Macu zmienia dla programistów aplikacji na Maca? Istniejące aplikacje działają, ponieważ „macOS automatically translates touches into clicks” (macOS automatycznie zamienia dotknięcia na kliknięcia), a reguły niosą trzy Tech Talki: gesture recognizery to „the only way to get direct touches on macOS” (jedyny sposób na bezpośredni dotyk w macOS), standardowe kontrolki natywnie obsługują dotyk, obszar dotyku wynosi 36 punktów, najechanie kursorem nie ma odpowiednika, a stanowiskiem testowym jest iPad podłączony przez Sidecar.1234 API dotyku są już w SDK macOS 27.0; przełączników gestów systemowych ani dostępnego na macOS ActivityKit nie ma w dwóch sprawdzonych przeze mnie SDK, a beta Xcode 27.3 ma status „Coming soon”.25678

TL;DR: Apple ogłosiło Touch na modelu MacBook Pro with PROLED XDR Display (14,2 i 16,3 cala, przedsprzedaż od 28 października, w sklepach od 6 listopada) i 28 października w trzech talkach wyjaśniło programistom, jak go przyjąć.129 Jeśli aplikacja używa standardowych kontrolek AppKit, gestów SwiftUI albo Mac Catalyst, talk mówi, że „just work” (po prostu działają), a audyt opisany niżej (obszary trafienia, hover) nadal obowiązuje. Własny kod mouseDown(with:) jest emulowany, dopóki nie przejdzie na zdarzenia kontrolek albo gesture recognizery, a framework UI spoza Apple dostaje ogólną warstwę emulacji, którą NSIsTouchNative wyłącza, gdy aplikacja sama obsługuje dotyk.36 Aby odebrać bezpośredni dotyk w AppKit, potrzebny jest gesture recognizer, ponieważ dotknięcia nigdy nie docierają do łańcucha responderów ani do monitorów zdarzeń.36 Talk projektowy ustala obszar dotyku na 36 punktów, czyli ten sam rozmiar fizyczny co 44 punkty na iOS, i mówi, że macOS wygląda tak samo z dotykiem i bez niego.4 Testować należy na iPadzie przez Sidecar; najnowsze elementy to macOS 27.2 i Xcode 27.2 RC, konfiguracja, której sam nie uruchamiałem.311 API dotyku są już w SDK macOS 27.0. Przełącznika gestów systemowych ani dostępnego na macOS ActivityKit nie ma w dwóch sprawdzonych przeze mnie SDK, a beta Xcode 27.3 ma status „Coming soon”.2378

Co Apple opublikowało, a czego nie

Apple ogłosiło nowość komunikatem prasowym, nie keynote’em; zapis całego dnia zawiera wpis na żywo. Treść dla programistów to w komunikacie trzy zdania w sekcji „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” (aplikacje Apple są zoptymalizowane pod nowego MacBooka Pro, a wiele istniejących aplikacji działa z Touch od razu, bo macOS automatycznie zamienia dotknięcia na kliknięcia), następnie „Updated system gesture APIs also enable developers to create intuitive experiences designed specifically for Touch” (zaktualizowane API gestów systemowych pozwalają też programistom tworzyć intuicyjne doświadczenia projektowane specjalnie z myślą o Touch) oraz uwaga, że „app developers can test how Touch performs in their iOS and iPadOS apps directly on the MacBook Pro display” (programiści aplikacji mogą testować, jak Touch działa w ich aplikacjach na iOS i iPadOS, bezpośrednio na ekranie MacBooka Pro).1 Sekcja o macOS mówi, że laptop „comes to life with macOS 27”, i wymienia „Touch built for macOS 27”; nie wskazuje wydania cząstkowego.1

Strona dla programistów była dostępna już o 11:47 czasu pacyficznego: wpis w aktualnościach „Say hello to Touch on Mac” i strona docelowa „Get ready for Touch on Mac” z trzema Tech Talkami, Group Labs 18 i 19 listopada oraz trzema kafelkami oznaczonymi „Coming soon”: „Xcode 27.3 beta”, „Documentation resources” i „Design resources”.2 Kod HTML strony zawiera linki, które Apple zamierza podpiąć pod te kafelki, w komentarzach oznaczonych do ponownego włączenia, gdy materiały się pojawią: artykuł AppKit „Adopting gesture recognizers in your app”, który dziś zwraca 404, istniejący przykład przeciągania i upuszczania z obietnicami plików, a wśród linków także cztery strony Human Interface Guidelines i Apple Design Resources; pobrane strony HIG nie zawierają żadnych wskazówek dotyczących dotyku na ekranie Maca, a dziennik zmian strony o Live Activities kończy się na 13 października.2710

Źródłami pierwotnymi reguł są więc talki oraz nota techniczna, którą Apple opublikowało 8 czerwca, „TN3212: Adopting gesture recognizers for Sidecar touch support”. Jej Overview mówi, że „In macOS 27, AppKit continues to standardize on gesture recognizers as the primary mechanism for input handling” (w macOS 27 AppKit dalej standaryzuje gesture recognizery jako główny mechanizm obsługi wejścia), a jej sekcje „Explore updated APIs in macOS 27”, „Detect touch capability”, „Handle control events” i „Configure scroll behavior” opisują powierzchnię API, którą demonstrują talki z 28 października.6 Każdy nowy symbol wymieniony w nocie figuruje w dokumentacji Apple z introducedAt macOS 27.0 i bez oznaczenia beta (pobrane 28 października w południe czasu pacyficznego), a poza dwoma kluczami Info.plist jest zadeklarowany w SDK macOS 27.0 wewnątrz Xcode 27.1 (27A9275), co sprawdziłem w nagłówkach i interfejsach Swift na tym Macu (analiza autora).7 Trzech symboli gestów systemowych wymienionych w talku tam nie ma, podobnie jak dostępnego na macOS ActivityKit; o obu niżej.

Nic do zrobienia, a co się dzięki temu dostaje

Historia zgodności jest hojna. Talk o AppKit od niej zaczyna: „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), i to samo dotyczy Mac Catalyst (0:52).3 W AppKit „Standard buttons, controls, tables, collections, split views, tabs, scrolling, and more are all touch native” (1:10) (czyli standardowe przyciski, kontrolki, tabele, kolekcje, widoki dzielone, karty, przewijanie i nie tylko natywnie obsługują dotyk).3

To, co natywne nie jest, podlega emulacji: „for existing custom AppKit mouse interactions, or if you use non-Apple UI frameworks, AppKit intelligently emulates the mouse” (1:17).3 Nota techniczna rozpisuje tę emulację dla frameworków firm trzecich: „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” oraz „A two-finger pinch or rotation simultaneously emulates both the trackpad magnify and rotate gestures”.6 Wersja z talku: „a one-finger scroll with momentum, click, drag with a small hold delay, and even pinch for rotation and magnification” (11:28).3 Emulacja działa na poziomie okna i jest ogólna, ponieważ „AppKit can’t determine what kind of interactions are allowed at any particular location of your non-Apple UI framework content” (11:17) (czyli AppKit nie może ustalić, jakie interakcje są dozwolone w danym miejscu treści frameworka UI spoza Apple).3

Po dodaniu natywnej obsługi emulację się wyłącza: „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 Klucz jest udokumentowany jako macOS 27.0, a jego strona mówi: „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.”7

Ujęcie z talku projektowego wyjaśnia, co „nic do zrobienia” znaczy wizualnie: „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) oraz „Touch is a secondary input for macOS, and therefore has little impact on how macOS looks” (1:06) (czyli dotyk jest dla macOS wejściem drugorzędnym i dlatego ma niewielki wpływ na wygląd systemu).4 Nie ma trybu dotykowego ani układu kompaktowego. To odwrotność sytuacji iPhone’a Duo, gdzie ekran wewnętrzny raportuje klasy rozmiaru regular w obu wymiarach.

Gesture recognizery to jedyna droga

Zdanie, które porządkuje całą resztę, pada w 3:45 talku o AppKit: „In fact, gesture recognizers are the only way to get direct touches on macOS.”3 Przed nim: „Starting with macOS Golden Gate, gesture recognizers are the preferred approach in AppKit” (3:33) oraz „gesture recognizers have become the shared input language across SwiftUI, Mac Catalyst, and now AppKit” (3:38) (czyli gesture recognizery stały się wspólnym językiem wejścia w SwiftUI, Mac Catalyst, a teraz także w AppKit).3 Nota techniczna mówi to samo od drugiej strony: „AppKit doesn’t deliver Sidecar touch events through the responder chain or through event monitors”, a w uwadze: „Local and global event monitors don’t receive touch events. Touch events don’t go through NSApp or sendEvent(_:).”6

Dla bazy kodu w AppKit wynikają z tego trzy konsekwencje.

Pierwsza: pętle śledzenia. Inżynier w talku przebudowuje łamigłówkę z kablami, która używała „a custom NSView with a mouseDown(with:) override that uses the standard tracking loop technique” (3:13), wywołując nextEvent(matching:) aż do puszczenia przycisku myszy, i mówi: „Migrate your mouse tracking loops to gesture recognizers” (3:51).3 Migracja nie musi być wszystko albo nic: „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) (czyli pętle śledzenia są nadal obsługiwane i mogą współistnieć z recognizerami tylko dla dotyku, a dodanie takich recognizerów może okazać się najszybszą i najmniej ryzykowną drogą do wydania cząstkowego aplikacji).3 Pierwszym krokiem jest refaktoryzacja, którą talk wykonuje, zanim cokolwiek doda: „The first step is to refactor my tracking loop into separate start, continue, end, and cancel tracking functions” (4:11), tak aby pętla myszy i recognizer dotyku mogły z nich wspólnie korzystać.3 Listing Apple, dosłownie:

// Refactored tracking functions
func startTracking(at viewLocation: NSPoint) { /* ... */ }

func continueTracking(at viewLocation: NSPoint) { /* ... */ }

func endTracking(at viewLocation: NSPoint) { /* ... */ }

func cancelTracking() { /* ... */ }

Przepis na recognizer tylko dla dotyku to wtedy dwa przypisania właściwości: „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)

Akcja kieruje stany recognizera .began, .changed, .ended i .cancelled do czterech funkcji. Powód istnienia ścieżki anulowania jest ten sam, który talk podał przy przycisku: „If tracking is canceled due to a system gesture like Exposé, scroll, or any other reason, I can revert any unintended changes” (2:41), a reguła noty technicznej brzmi „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 istnieje od macOS 10.10, a allowedTouchTypes od 10.12.2; nic w tym przepisie nie jest nowe.7

Druga: reguły, które narzucają recognizery. Nota techniczna: „If your view is covered by another, often transparent, view, your gesture recognizer won’t be triggered” oraz „You can’t place views on top of standard framework controls, because those controls now use gesture recognizers internally”, a wyjście proponuje sama: „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.”6 Własny recognizer musi się zakończyć: „End your active gesture recognizer by transitioning to ended, failed, or cancelled. If you don’t, recognizers are blocked from activating.”6 Do tego zmiana zachowania ograniczona do podklas budowanych z nowym SDK: „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”, ponieważ „Subclasses of NSGestureRecognizer must implement location(in:) to report a meaningful location.”6

Trzecia: co się traci. W kwestii akcji kontrolek nota mówi, że przejście na recognizery w NSControl „changes the timing of when AppKit delivers control action messages with respect to event processing”, więc currentEvent „no longer returns the event that triggered an action”; w zamian wskazuje NSEvent.pressedMouseButtons oraz modifierFlags na poziomie klasy i dodaje, że „a touch is not part of pressedMouseButtons”.6 Podklasa, która nadpisuje metodę lewego przycisku myszy, płaci za to: „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.”6

Kontrolki: zdarzenia zamiast mouseDown

Pierwsza refaktoryzacja w talku o AppKit dotyczy przycisku. Oryginał dziedziczył po NSButton i nadpisywał mouseDown(with:), aby wiedzieć, kiedy śledzenie się zaczyna i kończy; przy dotyku „the buttons work, but AppKit must emulate mouse events to pass to the mouseDown override” (2:17).3 Zastępstwem są zdarzenia NSControl „directly on NSButton without the need to subclass” (2:27); listing ze strony talku w 2:24 rejestruje na przycisku trzy wywołania addTarget(_:action:for:), dla [.trackingBegan, .trackingEntered], [.trackingExited, .trackingEndedInside] oraz .trackingCancelled, a zdarzenia ujawniają też stan, którego nadpisanie myszy nigdy nie widziało: „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 Same zdarzenia są stare: „NSControl events are available for standard AppKit controls, and most control events are available all the way back to macOS 11” (2:51).3 Po wzorzec talk odsyła do sesji WWDC26, którą nazywa „Modernizing your AppKit app”; sesja, którą nota techniczna podaje jako powiązane wideo, to „Modernize your AppKit app” (sesja WWDC26 289).36

macOS 27 dodaje przypadki do NSControl.Events, według sekcji noty „Handle control events”: trackingRepeated („An event when multiple mouseDown(with:) events with a click count greater than 1 occur”), valueChanged („An event when the value changes on continuous controls, such as sliders”), primaryActionTriggered, menuActionTriggered („An event that triggers when a menu gesture occurs, but before the menu presents”) oraz applicationReserved na własne potrzeby.67

Następnie wyłączność. „By default, only one view can be interacted with at a time” (7:20), co talk nazywa wyłącznością gestów, a nota techniczna tłumaczy zgodnością: „For maximum compatibility, AppKit restricts gesture activations to a single view hierarchy at a time” oraz „Unlike in iOS, the person can’t perform multiple interactions simultaneously, though scrolling is a notable exception” (czyli w przeciwieństwie do iOS nie da się prowadzić kilku interakcji naraz, z wyjątkiem przewijania).36 Rezygnuje się z niej dla każdego widoku osobno: „The API to control gesture exclusivity is the exclusiveGestureBehavior property on NSView” (7:48). Domyślna wartość właściwości „inherits its parent’s exclusive gesture behavior” (7:57), a „By setting the exclusiveGestureBehavior property on the stove view to .notExclusive, the child slider subviews all become non-exclusive as well” (8:01); cała aplikacja rezygnuje z niej kluczem Info.plist NSViewGestureRecognizerIsExclusive.367 Talk mówi, że właściwość „is available in the next SDK” (7:54). Dokumentacja Apple podaje ją jako macOS 27.0 bez oznaczenia beta, czerwcowa nota techniczna ją opisuje, a SDK macOS 27.0 wewnątrz Xcode 27.1 deklaruje ją w NSView.h jako API_AVAILABLE(macos(27.0)) z komentarzem „Defaults to .inherit”, więc SDK, które talk nazywa „next”, już było wydane, gdy talk się ukazał (analiza autora na podstawie zainstalowanych nagłówków).367

36 punktów

Talk projektowy podaje tę liczbę trzy razy, a talk o AppKit ją powtarza. „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) (czyli obszar dotyku 36 punktów na macOS daje na ekranie ten sam rozmiar fizyczny co 44 punkty na iOS).4 Obszar jest z założenia niewidoczny: „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).4

W przypadku własnych widoków zalecenie brzmi: powiększyć obszar trafienia, nie kontrolkę. Węzły z kablami w talku o AppKit były „a little tricky to touch” (5:14), więc inżynier dodał parametr expandHitRect, który „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) (czyli powiększa prostokąt docelowy do co najmniej 36 punktów na każdej osi, co ułatwia trafienie dotykiem w węzeł, a mysz nadal musi trafiać precyzyjnie i układ się nie zmienia); tę technikę poleca „for small resize or grab handles for selected objects in a canvas view” (6:07).3 Wersja z talku projektowego dla kontrolek spoza Apple: „consider increasing the touch target area around your control instead of changing the control size” (9:51).4

Rozmiary kontrolek się nie zmieniają. „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) oraz „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 Dla widoków przypominających ustawienia: „use FormStyle. Here as well, each row by default measures the 36-point height” (10:28).4 Małe i miniaturowe kontrolki nadal są dozwolone: „They fully support touch regardless of their size” (10:46), z jedną regułą dla własnych: „If your app is using custom small controls, ensure touch works, even though the tap target might be small” (10:50), ponieważ „touch events should never be ignored” (11:00).4

Najtrudniejszą część framework wykonuje sam dla trzech kontrolek, które nie mogą mieć 36 punktów: „the stepper, dial, and slider” (13:54) „now expand in place when interacting via touch” (14:07), nie zmieniając przy tym wartości przy dotknięciu, które je rozwija (14:26), i „collapse themselves when I’m not interacting with them” (14:41); w przypadku suwaków to opcja, bo „sliders have the option to expand when presented small” (15:36).4 Menu również się dostosowują: „when using touch, the menu shows slightly larger rows to help make selection easier” (11:23), a mogą to robić także widoki tymczasowe: „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).4

Hover znika

„Direct touches don’t have an equivalent to mouseMoved events” (10:38), więc wszystko, co pojawia się po najechaniu kursorem, wymaga decyzji.3 Reguły talku o 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) oraz „for hidden essential controls, install a touch-only click gesture recognizer to temporarily show the element on a touch tap” (10:57) (czyli dla ukrytych kontrolek o kluczowym znaczeniu należy zainstalować click gesture recognizer tylko dla dotyku, który tymczasowo pokaże element po dotknięciu).3 Nota techniczna potwierdza, że ścieżka wskaźnika pozostaje nietknięta: „Hovering via mouseMoved(with:) is still managed with NSTrackingArea.”6

Reguły talku projektowego są te same, widziane od strony użytkownika. „hover actions that are purely showing information, like tooltips, are not required to work with touch” (11:53); akcje, które dotykiem i tak są łatwe, nie potrzebują żadnej afordancji, jak przyciski przewijania karuzeli, które „remain hidden during a touch interaction” (12:22), ponieważ „horizontal scroll is always possible via touch” (12:19); „only the most important hover actions relevant to that content should reveal themselves” (12:30), a Safari po dotknięciu strony pokazuje dokładnie dwie (12:36); wreszcie „actions that appear on hover be duplicated elsewhere in your UI” (13:05), a przycisk udostępniania w Przypomnieniach przy dotyku znajduje się w menu kontekstowym wiersza (13:20).4

Przewijanie, długie przytrzymanie, przeciąganie, tekst

Przewija się jednym palcem na ekranie i dwoma na gładziku (4:39).4 Gdy jeden palec ma rysować zamiast przewijać, talk o AppKit ustawia „the decorating view’s enclosing scroll view to require two touches minimum for touch scrolling” (6:40); właściwość to NSScrollView.minimumNumberOfTouchesForScrolling, macOS 27.0, a obok niej maximumNumberOfTouchesForScrolling, isTouchScrollingEnabled i scrollGestureForRelationships.37 Recognizer, który ma ustępować przewijaniu, ustawia isCancellableByScrollGesture; „NSScrollView now supports pull-to-refresh functionality” przez NSRefreshController; a w NSPanGestureRecognizer para minimumNumberOfTouches i maximumNumberOfTouches „replace numberOfTouchesRequired”, właściwość wycofaną w 27.0.67

Długie przytrzymanie służy na Macu zarówno do przeciągania, jak i do menu kontekstowego, a rozstrzyga między nimi AppKit. „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) (czyli element, który można przeciągnąć, po długim przytrzymaniu powinien sygnalizować to animacją uniesienia, a podgląd uniesienia zapewniają istniejące API delegatów przeciągania i upuszczania w NSTableView, NSOutlineView i NSCollectionView).3 W przypadku menu: „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), a także „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) (czyli gdy używa się obu tych rodzajów API, AppKit koordynuje, kiedy długie przytrzymanie staje się przeciąganiem, a kiedy menu kontekstowym, a nawet pozwala użytkownikowi przełączać się między nimi).3 Talk projektowy pokazuje to z perspektywy użytkownika: zdjęcie „scales up under my finger” (3:50), obok pojawia się jego menu kontekstowe (3:58), a przeciąganie zamyka menu (4:05); Shift i Option nadal działają podczas przeciągania dotykiem (4:13).4 Dla własnych widoków beginDraggingSession(items:gesture:source:) rozpoczyna „a drag from a gesture recognizer”, nowość w 27.0.67

Tekst to słabe miejsce. Jedyne zdanie noty technicznej brzmi „NSTextSelectionManager allows custom text engines to support standard text gestures”, a klasa jest udokumentowana jako macOS 27.0 z opisem „An object that coordinates text selection behavior for custom text views”.67 Nagłówek uzupełnia kontrakt (analiza autora): klasa „provides a centralized way to manage text selection interactions using a set of gesture recognizers”, ma tryb interakcji edytowalny, tylko do zaznaczania albo nieinteraktywny, delegata przechowującego zaznaczenie i źródło danych układu.7 Żaden z talków nie omawia punktów wstawiania, uchwytów zaznaczenia ani menu edycji przy dotyku; wskazówki talku projektowego dotyczące zaznaczania odnoszą się do elementów, gdzie „on macOS we recommend to allow modeless selection through click and tap” (2:42), z pojedynczym dotknięciem do zaznaczenia i podwójnym do otwarcia (3:10).4

Gesty systemowe i przełącznik, którego nie ma w dokumentacji

macOS zastrzega na ekranie zestaw gestów wielopalcowych, które są „controlled by macOS and are therefore not available to any app running” (8:05): trzy palce w górę dla Mission Control i w dół dla App Exposé (8:13), szczypnięcie kciukiem i trzema palcami, aby pokazać aplikacje, i rozsunięcie, aby odsłonić biurko (8:22), trzy palce w lewo lub w prawo między przestrzeniami (8:32), przesunięcia od górnej i dolnej krawędzi dla ukrytego paska menu i Docka (8:37), przesunięcie nad Dynamic Island, aby przywołać Siri (8:46), oraz przesunięcia od krawędzi dla Centrum powiadomień i Centrum sterowania (8:51).4

Talk o AppKit trafia na ten konflikt przy trzech suwakach: „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), i pokazuje przełącznik: „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), z ostrzeżeniem „Only disable system gestures if the interaction capabilities they open up are critical for the window” (8:42) (czyli gesty systemowe należy wyłączać tylko wtedy, gdy możliwości interakcji, które otwiera ich wyłączenie, są dla okna kluczowe).3 Listing kodu na stronie talku wymienia wszystkie trzy: disablesDirectTouchSystemGestures w NSWindow, prefersDirectTouchSystemGesturesDisabled w UIViewController oraz directTouchSystemGesturesDisabled() w View SwiftUI.3 Żadnego z trzech nie ma 28 października w dokumentacji Apple; punkty końcowe JSON zwracają 404, a symboli brak w indeksach AppKit, UIKit i SwiftUI.7 Moja interpretacja, nie stwierdzenie Apple: to najwyraźniejszy znak, że SDK, które zakładają talki, to to oznaczone „Coming soon”.

SwiftUI i Mac Catalyst

SwiftUI dostaje jeden nowy typ: „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).3 GestureInputKinds jest udokumentowany na wszystkich siedmiu platformach w wersji 27.0, z .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 i .all, oraz z parametrami inputKinds: w onTapGesture, onLongPressGesture i inicjalizatorach TapGesture, SpatialTapGesture, LongPressGesture, DragGesture, MagnifyGesture i RotateGesture.7 Zdanie noty technicznej brzmi: „Use GestureInputKinds to limit gestures to specific types of input in SwiftUI.”6

Mac Catalyst korzysta z tego, co UIKit ma od iOS 9: talk mówi „UITouch.touchType and UIGestureRecognizer’s allowedTouchTypes” (0:59); udokumentowana właściwość to UITouch.type z wyliczeniem UITouch.TouchType, a allowedTouchTypes jest w UIGestureRecognizer od Mac Catalyst 13.1.37 Sformułowanie z talku to przejęzyczenie, nie nowe API.

Live Activities na Macu, przed dokumentacją

Trzeci talk jest krótki i stawia dużą tezę. „The Dynamic Island has come to the Mac. To fully take advantage of its capabilities, Mac apps now support native Live Activities” (0:05) oraz „now in macOS Golden Gate, applications running on the Mac can create Live Activities directly” (0:57) (czyli teraz, w macOS Golden Gate, aplikacje działające na Macu mogą bezpośrednio tworzyć Live Activities).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).5 Umiejscowienie: „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) (czyli na Macu z Dynamic Island Live Activities płynnie wtapiają się w górną krawędź urządzenia, a na innych urządzeniach i ekranach są wyświetlane w pasku menu).5 Kod jest kodem z iOS: model danych w ActivityAttributes (2:36), prezentacje compact i minimal w ActivityConfiguration z konstruktorem widoku Dynamic Island (3:24), jedyna prezentacja specyficzna dla Maca, „The menu bar expanded Live Activity view is created along with the ActivityConfiguration as a simple view” (3:52), podczas gdy „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), uruchomienia natychmiastowe, zaplanowane lub wypychane pushem (4:40), integracja „with existing backgrounding technologies on the Mac, like background tasks and user agents” (4:54), akcje przez App Intents (5:56) oraz „If you have an iOS activity, there’s no code to port” (7:09).5 Dwie reguły przechodzą z iOS: „Only a single Live Activity can be expanded at a time” (3:12) oraz „An activity is only expanded when interacted with or if explicitly triggered through an alert request” (3:06).5

Dokumentacja Apple jeszcze tego nie mówi. Opis strony frameworka ActivityKit wymienia „the Mac”, ale jej Overview mówi „On Mac, it appears in the Menu bar”, lista platform to iOS, iPadOS i Mac Catalyst 16.1, a Activity, ActivityAttributes, ActivityConfiguration, DynamicIsland i klucz NSSupportsLiveActivities nie wymieniają platformy macOS.87 Strona HIG o Live Activities, której dziennik zmian kończy się na 13 października, nadal opisuje wyłącznie ścieżkę przez sparowanego iPhone’a: „Active Live Activities automatically appear in the Menu bar of a paired Mac”, „Clicking the Live Activity launches iPhone Mirroring to display your app”, a pod nagłówkiem „macOS dimensions”: „Use the provided iOS dimensions.”10 SDK zgadzają się z dokumentacją, nie z talkiem: w SDK macOS 27.0 wewnątrz Xcode 27.1 i w SDK macOS 27.2 wewnątrz bety Xcode 27.2 (27B5019j) interfejs ActivityKit dla macOS oznacza ActivityAttributes, Activity, każde request i update jako @available(macOS, unavailable), co sprawdziłem na tym Macu (analiza autora). Właściwe zdanie do planu jest więc to wąskie: talk mówi, że możliwość istnieje w macOS Golden Gate, a ani dokumentacja, ani żadne ze sprawdzonych przeze mnie SDK nie pozwala jeszcze jej zbudować. Wpis o maszynie stanów pokazuje implementację na iOS wspólnego modelu uruchomienia, aktualizacji i zakończenia; własne limity Maca dotyczące czasu trwania, zamykania i pracy w tle nie występują jeszcze w żadnym źródle.

Projekt: macOS się nie zmienia

Końcowe reguły talku projektowego są na tyle krótkie, że warto przytoczyć je w całości. „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). „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) (czyli: nie przeprojektowywać aplikacji tylko po to, by obsługiwała dotyk, a aplikacja na Macu z dotykiem nie powinna różnić się wizualnie od tej samej aplikacji na Macu bez dotyku; używać gestów do nawigacji po aplikacji i bezpośredniej manipulacji treścią; stosować 36 punktów jako obszar dotyku na macOS i korzystać z frameworków Apple, aby uzyskać układy zoptymalizowane pod dotyk i rozwijane kontrolki; większość aplikacji od razu będzie świetnie działać z dotykiem; klawiatura i mysz mają pozostać głównym wejściem).4

Jedyna reguła przestrzenna dotyczy dłoni, nie pozycji urządzenia. „The edges of the display are easy to touch by grabbing the side of the display with my hand” (6:17), więc „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), podczas gdy „the center of the display is best used for coarse, imprecise and big gestures” (6:46) (czyli lewa i prawa strona okna aplikacji najlepiej nadaje się na bogate kontrolki i gęsty interfejs, taki jak inspektory i paski boczne nawigacji, a środek ekranu na zgrubne, nieprecyzyjne i duże gesty).4 Własne gesty podlegają trzem ograniczeniom: „your gestures should work with touch and trackpad and possibly Magic Mouse” (7:00), „Avoid adding gestures that only work with touch” (7:05) oraz „The action your gesture does should be duplicated elsewhere in the UI, for example in a menu” (7:37).4 Talk dopuszcza też coś, czego Mac nigdy nie miał: „macOS now allows multiple touch gestures at the same time” (5:30), a przykładem są dwa suwaki w Logic pod dwoma palcami (5:45).4 To strona użytkownika opisanej wyżej właściwości wyłączności: domyślne zachowanie AppKit dopuszcza jedną hierarchię widoków naraz, a .notExclusive to sposób, w jaki aplikacja otwiera resztę.36

Testowanie dziś: Sidecar i SDK, którego jeszcze nie ma

Laptop nie jest potrzebny. „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) oraz „The fastest way to get started with touch on Mac is with the Sidecar tools you already own” (12:09) (czyli z najnowszą betą macOS i narzędziami deweloperskimi wszystkie funkcje dotyku Maca z ekranem dotykowym są dostępne na iPadzie podłączonym do Maca przez Sidecar, a najszybciej można zacząć z narzędziami Sidecar, które już się ma).3 Nota techniczna wymaga iPada z iPadOS 27 i dodaje zastrzeżenie do sprawdzania możliwości (NSScreen.touchCapabilities, zbiór opcji z bitem .multiTouch): w macOS 27 sprawdzenie „returns true for all displays when a touch-capable Sidecar display is connected, not just for the Sidecar display”, z radą, że „it’s better to handle events regardless of input source and decide on an alternate presentation based on the interaction type, if needed”.67

Audyt z talku, w jego własnej kolejności: „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 Jest też skill: „there’s a gesture modernization skill that has an understanding of the features and changes I’ve talked about” (12:16); kafelek Xcode na stronie docelowej zawiera komentarz zastępczy TK skill, a żadne źródło go nie nazywa.23

Co zawierają wydane SDK, analiza autora na podstawie nagłówków i interfejsów Swift na tym Macu: SDK macOS 27.0 wewnątrz Xcode 27.1 (27A9275) deklaruje NSScreen.TouchCapabilities, pięć nowych przypadków zdarzeń NSControl, właściwości dotykowe NSScrollView, NSRefreshController, beginDraggingSession(items:gesture:source:) i exclusiveGestureBehavior, wszystkie jako API_AVAILABLE(macos(27.0)), a interfejs SwiftUICore dla macOS, który SwiftUI reeksportuje, deklaruje GestureInputKinds. Trzech przełączników gestów systemowych nie ma ani w tym SDK, ani w SDK macOS 27.2 wewnątrz bety Xcode 27.2 (27B5019j), ani w nagłówkach AppKit, ani w interfejsie SwiftUI, ani w nagłówkach UIKit dla Mac Catalyst, a interfejs ActivityKit dla macOS w obu SDK oznacza swoje API jako niedostępne.78

To dwa SDK, które sprawdziłem; Xcode 27.2 RC (27B48), datowany w kanale Releases Apple na 19 października, jest nowszy od tej bety i nie został sprawdzony, więc braki dotyczą wymienionych SDK i niczego poza nimi.11

Co zainstalować, aby testować dziś, czego sam nie testowałem: macOS 27.2 (26B123, wydany 26 października według kanału) i Xcode 27.2 RC, z iPadem na iPadOS 27 przez Sidecar; nota techniczna opisuje dotyk przez Sidecar jako działający w macOS 27, a kanał nie wymienia 28 października żadnej bety macOS 27.3.611 Jedno zastrzeżenie z własnych informacji o wydaniu RC: „macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target” oraz „Mac Catalyst builds with a 27.1 or 27.2 deployment target might be unable to use newly introduced API”, więc nie należy wybierać 27.1 jako deployment target dla macOS (kanał Releases wymienia macOS 27.0.1 i 27.2, a macOS 27.1 nie wymienia), a target Mac Catalyst na 27.1 lub 27.2, który nie widzi nowego API, należy traktować jako ten znany problem, nie jako brakujący symbol.11

Czego więc tu nie ma: obiecanej na stronie docelowej bety Xcode 27.3, podlinkowanego przez nią artykułu AppKit, trzech symboli gestów systemowych i dostępnego na macOS ActivityKit (nieobecnych w dwóch sprawdzonych SDK, niezweryfikowanych w RC 27.2), a także jakiejkolwiek wypowiedzi o symulatorze. Informacje o wydaniu Xcode 27.2 RC wspominają o dotyku raz, jako o poprawce w Device Hub dla wejścia, które przestawało działać „after a period of inactivity”, a informacje o wydaniu macOS 27.2 nie mają żadnego wpisu o dotyku, gestach ani Live Activities.11 API dotyku ukazały się z Xcode 27.1, reguły są opublikowane, a to, co nadchodzi, strona docelowa oznacza jako „Coming soon”.

Audyt dotyku dla każdej aplikacji na Maca

Analiza autora, nie wytyczne Apple: cztery kroki z talku, w kolejności, jako lista kontrolna. Nie stoją za nią jeszcze żadne testy w działaniu.

  1. Sidecar z iPadem na iPadOS 27, na najnowszym macOS i Xcode (macOS 27.2 i Xcode 27.2 RC), i dotknięcie każdego ekranu aplikacji, zanim cokolwiek zostanie zmienione.
  2. Wyszukanie nadpisań mouseDown(with:) i pętli nextEvent(matching:) oraz przypisanie każdego z nich do zdarzeń kontrolek, metody delegata albo gesture recognizera.
  3. Przegląd małych kontrolek i obszarów trafienia, z powiększeniem obszaru dotyku tam, gdzie to pomaga, i bez zmiany układu; talk dopuszcza mniejszą kontrolkę, o ile dotyk nadal na niej działa.
  4. Lista wszystkiego, co pojawia się po najechaniu kursorem, z decyzją dla każdego elementu: podpowiedź pozostaje wyłącznie dla myszy; akcja, która dotykiem i tak jest łatwa, niczego nie potrzebuje; kontrolka o kluczowym znaczeniu dostaje click recognizer tylko dla dotyku i drugie miejsce w interfejsie, na przykład w menu kontekstowym.

Jedyne, czego audyt nie przyniesie, to przeprojektowanie, ponieważ pierwsza reguła talku projektowego mówi, że nie powinno być żadnej różnicy wizualnej; jedyny układ, który może zmieniać się zależnie od wejścia, to układ tymczasowy, popover albo własne menu.

Czego Apple nie powiedziało

Każdy z poniższych punktów to pytanie, które źródła zostawiają otwarte, sprawdzone w komunikacie, na stronie docelowej, w trzech talkach, w nocie technicznej, na stronie specyfikacji, w informacjach o wydaniu Xcode 27.2 RC i macOS 27.2 oraz na czterech stronach HIG.

  • Które wydanie cząstkowe macOS przynosi Touch na wbudowanym ekranie i które SDK zawiera trzy nieudokumentowane symbole. Komunikat mówi „macOS 27” i wymienia macOS 27.2 tylko w przypisie o Siri AI; strona docelowa mówi „Xcode 27.3 beta”, „Coming soon”.
  • Czy binarium zbudowane ze starszym SDK zachowuje się przy dotyku tak samo jak przebudowane z SDK macOS 27. Talk mówi „all apps”; nota techniczna wiąże z nowym SDK wyłącznie zmianę location(in:).
  • Apple Pencil lub nacisk na ekranie oraz to, czy szkło wyczuwa palec, zanim ten go dotknie. Talki odnoszą się do braku stanu najechania podobnego do myszy; żadne źródło nie wspomina o rysiku, nacisku ani wykrywaniu zbliżenia, a GestureInputKinds.pencil figuruje dla macOS 27.0 jak każdy inny element, choć żadne źródło nie mówi, że ekran wykrywa rysik.7
  • Dotyk na ekranach zewnętrznych lub w trybie z zamkniętą pokrywą oraz to, czy użytkownicy mogą wyłączyć Touch.
  • Edycja tekstu dotykiem: punkty wstawiania, uchwyty, lupa i menu edycji.
  • Dostępność przy ekranie dotykowym. Strona specyfikacji wymienia AssistiveTouch i Touch Accommodations wśród funkcji laptopa i nie mówi, czy są one nowe na Macu.9
  • Jak aplikacja „Designed for iPad” odbiera dotknięcia na ekranie Maca i czy różni się to od Mac Catalyst.
  • Ścieżka przez symulator lub Device Hub dla dotyku na Macu bez iPada.
  • Treści webowe: czy WKWebView i Safari przekazują stronom zdarzenia dotyku, czy wskaźnika.
  • Jak okna i treści pełnoekranowe mają się do Dynamic Island i które API bezpiecznego obszaru ją raportuje.
  • Szczegóły Live Activities na macOS: wydanie cząstkowe i SDK, czy NSSupportsLiveActivities jest wymagany, jak działają push-to-start i rejestracja w APNs na Macu oraz jakie wymiary ma aktywność natywna dla Maca.

Kalendarz

  • 28 października: przedsprzedaż w 30 krajach i regionach; strona dla programistów i trzy talki; nota techniczna jest dostępna od 8 czerwca.126
  • 6 listopada: laptop trafia do klientów i sklepów.1
  • 18 listopada, od 9:00 do 10:00 czasu pacyficznego, oraz 19 listopada, od 18:00 do 19:00 czasu pacyficznego: Touch on Mac Group Labs, online, z inżynierami i projektantami Apple.2
  • „Coming soon”: beta Xcode 27.3, materiały dokumentacyjne, materiały projektowe.2
  • W listopadzie: aktualizacja Apple Creator Studio, której funkcje dotykowe w Logic Pro i Final Cut Pro opisuje komunikat; wymienione w nim aplikacje firm trzecich „will be available later this year”.1

Najważniejsze wnioski

Dla programistów AppKit: standardowe kontrolki już natywnie obsługują dotyk; własny kod mouseDown(with:) jest emulowany, dopóki nie przejdzie na zdarzenia kontrolek albo gesture recognizery, a NSPanGestureRecognizer tylko dla dotyku z buttonMask = 0 i allowedTouchTypes = .direct to droga na wydanie cząstkowe, którą poleca talk; API są w SDK macOS 27.0, które już się ma.37

Dla programistów SwiftUI i Catalyst: gesty już działają; GestureInputKinds to jedyny nowy typ w SwiftUI, a odpowiedzią Catalyst są UITouch.type i allowedTouchTypes.37

Dla projektantów: 36 punktów, niewidocznych; żadnego przeprojektowania; kluczowe akcje dostępne po najechaniu kursorem muszą być osiągalne dotykiem i umieszczone także w innym miejscu interfejsu, na przykład w menu kontekstowym, przy czym podpowiedzi są z tego zwolnione; gęsty interfejs przy krawędziach, zgrubne gesty na środku.4

Dla planowania: testować na Sidecar już teraz; przed zbudowaniem czegokolwiek, co wyłącza gesty systemowe albo tworzy Live Activity natywną dla Maca, sprawdzić, czy zainstalowane SDK deklaruje te API, ponieważ dwa sprawdzone tutaj SDK tego nie robią, a Xcode 27.2 RC pozostaje niezweryfikowany; następnym SDK, które Apple zapowiedziało, jest beta Xcode 27.3.278

FAQ

Czy moja obecna aplikacja na Maca działa z Touch?

Apple mówi, że w przypadku większości aplikacji tak: „many existing apps work with Touch right away, because macOS automatically translates touches into clicks”, a talk o AppKit mówi, że standardowe komponenty AppKit, SwiftUI i Mac Catalyst oraz istniejące gesty „just work”.13 Własny kod śledzenia myszy jest emulowany, dopóki nie przejdzie na zdarzenia kontrolek albo gesture recognizery; framework UI spoza Apple dostaje ogólną warstwę emulacji, którą NSIsTouchNative wyłącza, gdy aplikacja sama obsługuje dotyk.36

Jak odebrać bezpośredni dotyk w AppKit?

Za pomocą gesture recognizera. Talk mówi, że „gesture recognizers are the only way to get direct touches on macOS”, a nota techniczna, że zdarzenia dotyku nie przechodzą przez łańcuch responderów, monitory zdarzeń, NSApp ani sendEvent(_:).36 Recognizer tylko dla dotyku ustawia buttonMask na 0, a allowedTouchTypes na .direct.3

Jaki jest obszar dotyku na macOS?

36 punktów, „the same physical size on display as iOS’s 44 points” (ten sam rozmiar fizyczny co 44 punkty na iOS). Kontrolki frameworka już go spełniają bez zmiany rozmiaru; w przypadku własnych widoków należy powiększać obszar trafienia, a nie sam widok.43

Jak przetestować Touch bez nowego MacBooka Pro?

Podłączyć iPada z iPadOS 27 przez Sidecar. Warunek z talku to „With the latest macOS beta and developer tools” (11:59), a bety macOS 27.3 nie ma, więc konfiguracja, którą bym wypróbował, to macOS 27.2 z Xcode 27.2 RC, czego sam nie testowałem.3611

Czy API dotyku są dziś w SDK?

Tak, w przypadku wszystkiego, co demonstrują talki, z wyjątkiem przełączników gestów systemowych i Live Activities natywnych dla Maca, których nie ma w dwóch sprawdzonych tutaj SDK (Xcode 27.2 RC nie został sprawdzony). SDK macOS 27.0 wewnątrz Xcode 27.1 deklaruje NSScreen.TouchCapabilities, nowe przypadki zdarzeń NSControl, właściwości dotykowe NSScrollView, NSRefreshController, exclusiveGestureBehavior i sesję przeciągania opartą na gestach, a interfejs SwiftUICore deklaruje GestureInputKinds; dokumentacja Apple podaje je jako macOS 27.0 bez oznaczenia beta.7 Przełączników gestów systemowych dla okna, kontrolera widoku i widoku nie ma ani w dokumentacji, ani w SDK z Xcode 27.1 i bety 27.2, ActivityKit w obu oznacza swoje API jako niedostępne na macOS, a strona docelowa oznacza betę Xcode 27.3 jako „Coming soon”.278

Czy aplikacja na Maca może tworzyć Live Activities?

Talk mówi, że tak, w macOS Golden Gate, z tym samym kodem ActivityKit i WidgetKit co na iOS i z prezentacją w pasku menu na Macach bez Dynamic Island.5 Dokumentacja ActivityKit i HIG nie wymieniają jeszcze macOS jako platformy dla aktywności tworzonych przez aplikacje, opisują ścieżkę przez pasek menu ze sparowanym iPhone’em, a interfejs ActivityKit w SDK z Xcode 27.1 i bety 27.2 oznacza API jako niedostępne na macOS.108

Skąd pochodzą fakty w tym wpisie?

Z komunikatu, wpisu w aktualnościach dla programistów i strony docelowej, z angielskich ścieżek napisów trzech Tech Talków z pierwszym znacznikiem czasu każdego cytatu w nawiasie, z czerwcowej noty technicznej, z JSON dokumentacji Apple dla każdego wymienionego symbolu, ze strony specyfikacji, z informacji o wydaniu Xcode 27.2 RC i macOS 27.2 oraz z czterech stron HIG, wszystkich pobranych 28 października 2026, a także z nagłówków i interfejsów Swift SDK macOS 27.0 i bety 27.2 na moim Macu, co stanowi analizę autora. Relacje prasowe nie są źródłem.

Źródła


  1. Apple Newsroom, Apple unveils groundbreaking MacBook Pro with PROLED XDR Display, 28 października 2026, po raz pierwszy zauważone w kanale Newsroom o 10:09 czasu pacyficznego (znacznik updated w kanale: 17:09:28Z). Sekcje „Touch Arrives on Mac”, „Say Hello to the Dynamic Island on Mac” i „macOS 27 Golden Gate”; ceny i dostępność; przypis 4 o aplikacjach firm trzecich. ↩↩↩↩↩↩↩↩

  2. Apple Developer, Say hello to Touch on Mac, 28 października 2026, oraz Get ready for Touch on Mac, pobrane 28 października 2026 o 11:49 czasu pacyficznego: trzy talki, „Touch on Mac Group Labs” 18 listopada od 9:00 do 10:00 czasu pacyficznego i 19 listopada od 18:00 do 19:00 czasu pacyficznego oraz kafelki „Xcode 27.3 beta”, „Documentation resources” i „Design resources”, każdy oznaczony „Coming soon”, z linkami przechowywanymi w komentarzach HTML. ↩↩↩↩↩↩↩↩↩↩↩↩

  3. Apple Developer, Tech Talk Bring Touch to your Mac app, 13:19, Raleigh Ledet, 28 października 2026. Cytaty pochodzą z angielskiej ścieżki napisów; czas w nawiasie to pierwszy znacznik cytowanego fragmentu. Wśród listingów kodu na stronie talku: „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); trzy listingi przytoczone we wpisie skopiowano ze strony dosłownie. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  4. Apple Developer, Tech Talk Design for touch on Mac, 16:52, Cas Lemmens, 28 października 2026. Cytaty z angielskiej ścieżki napisów, pierwszy znacznik w nawiasie. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  5. Apple Developer, Tech Talk Bring Live Activities to Mac, 7:40, Jonathan Tilley, 28 października 2026. Cytaty z angielskiej ścieżki napisów, pierwszy znacznik w nawiasie. ↩↩↩↩↩↩↩

  6. Dokumentacja Apple dla programistów, TN3212: Adopting gesture recognizers for Sidecar touch support, historia wersji „2026-06-08 First published”, pobrane 28 października 2026 w południe czasu pacyficznego. Cytowane sekcje: 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” oraz „Handle deprecations and behavior changes”. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  7. JSON dokumentacji Apple (developer.apple.com/tutorials/data/documentation/<path>.json, dane stojące za podlinkowanymi tu stronami), pobrane 28 października 2026 od 11:55 do 12:05 czasu pacyficznego. Podane jako macOS 27.0 bez oznaczenia beta: NSScreen.TouchCapabilities i .multiTouch, NSControl.Events .trackingRepeated, .valueChanged, .primaryActionTriggered, .menuActionTriggered i .applicationReserved, NSScrollView .isTouchScrollingEnabled, .minimumNumberOfTouchesForScrolling, .maximumNumberOfTouchesForScrolling, .scrollGestureForRelationships i .refreshController, NSRefreshController, NSPanGestureRecognizer.minimumNumberOfTouches i .maximumNumberOfTouches, NSGestureRecognizer.isCancellableByScrollGesture, NSView.exclusiveGestureBehavior i ExclusiveGestureBehavior, NSView.beginDraggingSession(items:gesture:source:), NSTextSelectionManager, NSIsTouchNative (jego strona: „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 oraz GestureInputKinds wraz z elementami (wszystkie siedem platform w wersji 27.0). Starsze: NSGestureRecognizer i konkretne podklasy (macOS 10.10), allowedTouchTypes (10.12.2), przypadki śledzenia w NSControl.Events (11.0), UITouch.type i UIGestureRecognizer.allowedTouchTypes (iOS 9.0, Mac Catalyst 13.1); numberOfTouchesRequired wycofane w 27.0. Nie znaleziono (HTTP 404, brak w indeksach frameworków): NSWindow.disablesDirectTouchSystemGestures, UIViewController.prefersDirectTouchSystemGesturesDisabled, directTouchSystemGesturesDisabled() w SwiftUI oraz artykułu „Adopting gesture recognizers in your app”. Sprawdzenie SDK 28 października 2026 (analiza autora), w MacOSX27.0.sdk wewnątrz Xcode 27.1 (27A9275): wiersz 583 w NSView.h brzmi @property NSViewExclusiveGestureBehavior exclusiveGestureBehavior API_AVAILABLE(macos(27.0)); pod komentarzem „Defaults to .inherit”; NSScreen.h deklaruje NSScreen.TouchCapabilities i touchCapabilities; NSControl.h deklaruje NSControlEventTrackingRepeated, ValueChanged, PrimaryActionTriggered, MenuActionTriggered i ApplicationReserved; NSScrollView.h deklaruje touchScrollingEnabled, minimumNumberOfTouchesForScrolling, maximumNumberOfTouchesForScrolling (wiersz 148), scrollGestureForRelationships i refreshController; NSRefreshController.h deklaruje klasę; NSPanGestureRecognizer.h deklaruje minimumNumberOfTouches i maximumNumberOfTouches oraz oznacza numberOfTouchesRequired jako wycofane z zamiennikiem minimumNumberOfTouches; NSGestureRecognizer.h deklaruje cancellableByScrollGesture; NSTextSelectionManager.h deklaruje klasę i jej Mode z komentarzem „provides a centralized way to manage text selection interactions using a set of gesture recognizers”; NSView.h deklaruje beginDraggingSession(items:gesture:source:); wszystkie jako API_AVAILABLE(macos(27.0)). SwiftUICore.swiftmodule/arm64e-apple-macos.swiftinterface deklaruje GestureInputKinds w wierszu 25274 pod @available(anyAppleOS 27.0, *), a interfejs SwiftUI, który go reeksportuje, deklaruje parametry inputKinds: w onTapGesture, onLongPressGesture (wiersz 22962) oraz w inicjalizatorach SpatialTapGesture, LongPressGesture, DragGesture, MagnifyGesture i RotateGesture, natomiast TapGesture.init(count:inputKinds:) znajduje się w interfejsie SwiftUICore (wiersz 18305). DirectTouchSystemGestures nie występuje w żadnym nagłówku AppKit, w żadnym interfejsie Swift SwiftUI ani SwiftUICore dla macOS ani w żadnym nagłówku UIKit dla Mac Catalyst, ani w tym SDK, ani w MacOSX27.2.sdk wewnątrz bety Xcode 27.2 (27B5019j). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  8. Dokumentacja Apple dla programistów, ActivityKit, pobrane 28 października 2026: opis „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”, platformy iOS, iPadOS i Mac Catalyst 16.1; Activity, ActivityAttributes, ActivityContent (iOS i iPadOS 16.1 lub 16.2), ActivityConfiguration i DynamicIsland z WidgetKit (iOS i iPadOS 16.1) oraz NSSupportsLiveActivities (iOS i iPadOS 16.1), żaden nie wymienia macOS. Displaying live data with Live Activities, opis: „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.” Sprawdzenie SDK (analiza autora): ActivityKit.swiftmodule/arm64e-apple-macos.swiftinterface w MacOSX27.2.sdk (beta Xcode 27.2, 27B5019j) zawiera @available(macOS, unavailable) przy ActivityAttributes, Activity, każdym przeciążeniu request i update; arm64e-apple-macos.swiftinterface w MacOSX27.0.sdk (Xcode 27.1, 27A9275) zawiera te same oznaczenia. ↩↩↩↩↩↩↩

  9. Apple, MacBook Pro with PROLED XDR Display Technical Specifications, pobrane 28 października 2026 o 11:57 czasu pacyficznego: „14.2-inch (diagonal) tandem OLED display” przy „3024-by-1986 native resolution at 254 pixels per inch”, „16.3-inch (diagonal) tandem OLED display” przy „3472-by-2266 native resolution at 254 pixels per inch”, wiersze sekcji Display „Touch”, „Multi-Touch gesture support” i „Dynamic Island” oraz „ProMotion technology with adaptive refresh rates from 10Hz to 120Hz”. ↩↩

  10. Apple Developer, Human Interface Guidelines, Gestures (dziennik zmian „September 9, 2024”), Pointing devices („June 21, 2023”), Designing for macOS oraz Live Activities („October 13, 2026 | Added guidance for limited width layouts, and updated supported platforms and specifications.”), wszystkie pobrane 28 października 2026; żadna nie wspomina o dotyku na ekranie Maca. 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”, a pod nagłówkiem „macOS dimensions”: „Use the provided iOS dimensions.” ↩↩↩

  11. Dokumentacja Apple dla programistów, Xcode 27.2 RC Release Notes, pobrane 28 października 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, pobrane tego samego dnia: żaden wpis nie wspomina o dotyku, gestach, Sidecar ani Live Activities. Apple Developer, kanał RSS Releases, pobrany 28 października 2026: „Xcode 27.2 RC (27B48)” z datą Mon, 19 Oct 2026 10:00:00 PDT, „macOS 27.2 (26B123)” z datą Mon, 26 Oct 2026 10:00:00 PDT i brak pozycji z nazwą macOS 27.3 lub Xcode 27.3. ↩↩↩↩↩↩

Powiązane artykuły

Obrazki w pozycjach menu znikają w macOS 27 i iPadOS 27

macOS 27 i iPadOS 27 domyślnie ukrywają obrazki w pozycjach menu, a to, co zniknie, zależy od SDK. Trzy frameworki, trzy…

11 min czytania

Era iPhone'a o zmiennym rozmiarze: jak przygotować aplikację przed wrześniem

iOS 27 wyznacza granicę zmiany rozmiaru na poziomie SDK, z którym budowana jest aplikacja. Lista kontrolna: audyt założe…

9 min czytania

Mac App Store nie pozwala istnieć menedżerom okien. I tak wydałem jednego.

App Sandbox blokuje API, którego potrzebuje każdy kafelkownik okien, a Apple odpowiedziało: dystrybuować poza sklepem. 9…

9 min czytania