Co oznacza to kryterium
Użytkownik może mieć telefon zamocowany w uchwycie albo wybierać poziom, by łatwiej czytać. Udostępnij treść i działania w wybranej przez niego orientacji. Układ może się zmienić; adres i przycisk nie powinny wymagać obrotu sprzętu.
Kryterium pomaga przede wszystkim osobom z ograniczeniami ruchowymi i osobom słabowidzącym. Dopuszcza wyjątek niezbędności, który trzeba uzasadnić dla konkretnej informacji lub działania.
Przykłady błędów i poprawek
Ten sam adres w dwóch orientacjach
Pracownia pokazuje to samo zamówienie P-104 i ten sam adres. W good pozostawia domyślną politykę systemu oraz przewijaną treść; przycisk pokazuje i ukrywa adres również po obrocie. Flutter dobrano, bo ograniczenie natywnego hosta wymaga wykonania na iOS. Minimalne WWW dobrano, by niezależnie zbadać autorską bramkę w bezpośrednim zakresie WCAG.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.
To sekwencja dwóch rzeczywistych stanów, nie film obrotu. Odczyt urządzenia i ramki oraz wejścia mają źródło w obserwacjach iOS. Kadr sam nie potwierdza rotacji.
Autor ustawia wyłącznie portraitUp
Bad różni się od good tylko żądaniem orientacji. Po landscapeLeft urządzenie testowe raportuje poziom, ale aplikacja utrzymuje pionową ramkę 402×874. Na fizycznym uchwycie poziomym taka treść wymagałaby patrzenia na bok lub obrotu sprzętu. Usunięcie ograniczenia przy zachowaniu treści usuwa badaną barierę. To własne odtworzenie mechanizmu F97 według interpretacji WCAG2ICT; urządzenie fizyczne NOT-RUN.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.
Surowy XCUIScreen może przedstawiać zapis w orientacji interfejsu. Nie obracano ani nie retuszowano PNG, aby wizualnie imitować fizyczny telefon. Dowodem ograniczenia jest sparowany odczyt deviceOrientation i app frame.
WWW zastępuje treść żądaniem obrotu
Bad w poziomym viewporcie ukrywa całe main, w tym adres i jego przycisk, i pokazuje komunikat „Obróć urządzenie do pionu”. W good usunięto bramkę, zachowując identyczne dane i działanie. Ustawienia demonstracji są dostępne poza main, aby odzyskać demonstrację; nie udostępniają użytkownikowi adresu w błędnym wariancie i nie są alternatywną drogą treści produktu.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.
CSS orientation bada relację wysokości i szerokości viewportu, nie czujnik fizyczny. Powyżej rzeczywiście przeprowadzono resize i kliknięcia w IAB/macOS; nie przeprowadzono obrotu telefonu z WWW. Zapis DOM i AX potwierdza authored gate, odpowiadający F100; nie potwierdza toru czujnik → przeglądarka na telefonie.
Kontrola: sugestia bez ograniczenia
Control dodaje tylko „Polecamy pion. Możesz korzystać także w poziomie.” Nie blokuje widoku ani przycisku. Obsługa w obu orientacjach pozostaje dostępna — samo słowo „pion” nie jest wynikiem FAIL.

Pracownia, 2026-10-04: rzeczywisty stan iOS Simulator albo viewportu IAB/macOS. Sam kadr nie dowodzi fizycznego obrotu telefonu; zakres sekwencji opisano w tekście.
Źródłowa kontrola webowa pozwala ujawnić adres; dół jej treści wymaga przewinięcia. Nie osadzono tego dodatkowego kadru. Brak całego adresu w jednym viewporcie sam nie oznacza blokady orientacji.
Kiedy obowiązuje i gdzie są wyjątki
Essential oznacza, że usunięcie ograniczenia zasadniczo zmieniłoby informację lub działanie, a równoważny cel nie jest osiągalny inną zgodną drogą. Wygoda projektowania, koszt drugiego układu, wygląd marki czy „tak zaprojektowano ekran” nie spełniają tej definicji. Zwykły punkt odbioru z adresem nie ma tego wyjątku.
Możliwy kontekst niezbędności to zachowanie relacji fizycznej klawiatury fortepianu, przechwycenie obrazu czeku albo treść przeznaczona do konkretnego nierotowalnego odbiornika. Nazwa typu aplikacji nie zwalnia całego procesu: menu, ustawienia czy formularze nadal oceniać w swoim kontekście. W tej demonstracji nie zaimplementowano ani nie zatwierdzono wyjątku essential.
Blokada autora i wybór użytkownika są różnymi przyczynami tego samego obrazu. Systemowe zablokowanie orientacji przez użytkownika nie jest usterką treści; respektowanie tego wyboru jest właściwe. Nie oceniać na podstawie nieruchomego screenshotu bez ustalenia konfiguracji OS i kodu.
Kryterium dotyczy ograniczenia orientacji. Inna ilość treści po zmianie rozmiaru, clipping, utrata formularza lub przewijanie mogą wymagać innych ocen; sam breakpoint nie dowodzi naruszenia 1.3.4. Pion/poziom nie wymaga identycznego układu ani obsługi czterech kierunków, których sprzęt nie wspiera. Format szerokiego filmu nie uzasadnia blokady całej strony odtwarzacza.
G214 opisuje możliwą wystarczającą technikę: działająca kontrolka zmienia orientację treści bez konieczności obracania sprzętu. Przycisk musi dawać rzeczywisty dostęp; przełącznik wariantu naszej demonstracji nie jest taką funkcją produktu. Preferujemy brak blokady i systemowy wybór użytkownika. F97 opisuje blokadę orientacji, F100 — zastąpienie treści komunikatem o obrocie. To pomocnicze techniki i błędy, a nie dodatkowe wymagania normatywne.
Platformy
Podstawy są odrębne: normatywne WCAG 2.2 dla WWW oraz informacyjne WCAG2ICT, Group Note 2025-12-11, dla treści poza treścią webową. Ta interpretacja nie ustala obowiązków prawnych ani zgodności z EN 301 549. Każdy wiersz zweryfikowano przez AI 2026-10-04; człowiek NOT-RUN.
| Środowisko / ID | Podstawa / kryterium | Stan i warunek | Adaptacja i uzasadnienie | Wykonanie |
|---|---|---|---|---|
WWW / web |
WCAG 2.2 / 1.3.4 | dotyczy; uwzględnić wyjątek essential | Bez zmiany wymagania; także przeglądarka telefonu. | IAB/macOS, test bramki CSS; fizyczny obrót WWW NOT-RUN. |
Aplikacje mobilne / mobile |
WCAG2ICT 2025-12-11 / 1.3.4, oprogramowanie | dotyczy warunkowo; sprzęt obracany w typowym użyciu | Wymaganie bez zmiany, z warunkiem sprzętowym; zwykły telefon spełnia warunek. | Flutter na iPhone 17 Simulator; Android i fizyczny telefon NOT-RUN. |
Aplikacje desktopowe / desktop |
ta sama Note / 1.3.4, oprogramowanie | dotyczy warunkowo | Monitor obracany w typowym użyciu wymaga badania; sama nazwa desktop nie wyłącza kryterium. | NOT-RUN. |
Dokumenty cyfrowe / document |
ta sama Note / 1.3.4, dokumenty | dotyczy warunkowo | Zastosowanie wyłączone dla dokumentu, który nigdy nie będzie wyświetlany na sprzęcie obracanym w typowym użyciu. Format strony PDF nie oznacza blokady orientacji odbiornika. | NOT-RUN. |
Stały katalog budynku / other |
ta sama Note / 1.3.4, oprogramowanie | dotyczy warunkowo; nie dotyczy opisanego scenariusza stałych ekranów | Gdy jedynym odbiornikiem jest ekran trwale umocowany w jednej orientacji, warunek nie zachodzi. Aplikacja zdalna telefonu wymaga osobnej oceny. | Kontrola interpretacyjna, nie demonstracja sprzętu; NOT-RUN. |
Nie kopiujemy tego wyłączenia natywnego do treści webowej. W hybrydzie badać również maskę orientacji hosta ograniczającą WebView. Reguły zastosowania wyjaśniają rozdzielenie platformy, wykonania i podstawy prawnej.
Rozwiązania w technologiach
Flutter
Good w kodzie używa pustej listy SystemChrome.setPreferredOrientations([]); oddaje decyzję systemowi. Bad żąda [DeviceOrientation.portraitUp]. Zmiana wariantu i reset stosują nową politykę i czyszczą adres; dispose zwalnia ograniczenie. ListView w SafeArea pozwala przewijać, gdy wysokość jest mała. Dla produkcyjnego ekranu, który nigdy nie ustawia blokady, zwykle wystarczy w ogóle jej nie wprowadzać.
import 'package:flutter/services.dart';
Future<void> releaseAuthoredLock() =>
SystemChrome.setPreferredOrientations([]);Wspólne Info.plist już dopuszcza portrait, landscapeLeft i landscapeRight na iPhonie; nie zmieniano go. Sam Dart nie rozszerzy węższej konfiguracji hosta. Na iPadzie ograniczenie zależy od multitaskingu; nie wyłączaj multitaskingu tylko dla wymuszenia blokady. Flutter dokumentuje też ograniczenie setterów na Androidzie 16/API 36 przy szerokości ekranu co najmniej 600 dp; brak skutku API nie oznacza, że autor nie próbował blokować.
iOS / SwiftUI
Dopuść pion i oba poziomy w konfiguracji targetu; nie dodawaj węższej maski w kontrolerze hostującym lub kodzie scene. SwiftUI nie ma tu uniwersalnego modyfikatora „zgodny z 1.3.4”. Poniższy widok jest kontekstem układu, a nie przełącznikiem orientacji:
import SwiftUI
struct PickupView: View {
@State private var shown = false
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
Text("Zamówienie P-104 · Pracownia")
Button(shown ? "Ukryj adres" : "Pokaż adres") {
shown.toggle()
}
if shown { Text("Adres: ul. Przykładowa 12, Warszawa.") }
}.padding()
}
}
}UIKit rozstrzyga rotację na podstawie orientacji urządzenia, aplikacji i odpowiedniego kontrolera. Przy nowszym cyklu scene sprawdzać właściwe API geometrii i wersję SDK; nie wymuszać orientacji przez prywatne KVC. Fragment SwiftUI nie był kompilowany ani uruchamiany.
Android / Compose
W aktywności usuń wymuszenie portrait/landscape w manifest i runtime. Jeśli trzeba jawnie określić politykę respektującą wybór użytkownika, kontekst manifestu może używać android:screenOrientation="user". Nie zastępuj jej bezrefleksyjnie sensor, które może ignorować systemową blokadę użytkownika. Compose musi pozwalać na układ w obu przestrzeniach; przechowaj mały stan po odtworzeniu aktywności.
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
@Composable
fun Pickup() {
var shown by rememberSaveable { mutableStateOf(false) }
Column(Modifier.verticalScroll(rememberScrollState())) {
Text("Zamówienie P-104 · Pracownia")
Button(onClick = { shown = !shown }) {
Text(if (shown) "Ukryj adres" else "Pokaż adres")
}
if (shown) Text("Adres: ul. Przykładowa 12, Warszawa.")
}
}Ten kod nie zmienia manifestu, a zachowanie rememberSaveable nie dowodzi dostępności całej aplikacji. Androida nie uruchamiano; nie zbudowano osobnej aplikacji Compose.
React Native
Odblokuj orientacje w natywnych targetach i usuń runtime lock z używanego modułu, jeśli istnieje. Sam useWindowDimensions obserwuje aktualne wymiary, nie odblokowuje hosta. Przykład bez nowego pakietu:
import React, { useState } from 'react';
import { Button, ScrollView, Text, useWindowDimensions } from 'react-native';
export function Pickup() {
const [shown, setShown] = useState(false);
const { width } = useWindowDimensions();
return (
<ScrollView contentContainerStyle={{ padding: width < 500 ? 16 : 24 }}>
<Text>Zamówienie P-104 · Pracownia</Text>
<Button
title={shown ? 'Ukryj adres' : 'Pokaż adres'}
onPress={() => setShown(!shown)}
/>
{shown && <Text>Adres: ul. Przykładowa 12, Warszawa.</Text>}
</ScrollView>
);
}HTML / CSS
HTML/CSS i JavaScript pokazują bad/good/control. Poprawka usuwa display:none dla main w poziomie oraz komunikat zastępujący treść. Media queries można nadal stosować do zmiany układu. Screen Orientation API lock wymaga osobnej kontroli zgodności i warunków przeglądarki; brak jego wywołania nie dowodzi braku bramki CSS lub transformacji.
| Technologia | Oficjalna dokumentacja, 2026-10-04 | Kompilacja / analiza | Działanie |
|---|---|---|---|
| Flutter 3.44.9 / Dart 3.12.2 | sprawdzona; setter i ograniczenia | analiza, testy hostowe i świeży build iOS PASS | dedykowany iOS Simulator; wyniki poniżej |
| SwiftUI / UIKit | sprawdzona; ScrollView, plist, maska kontrolera, scene geometry | snippet NOT-RUN; XCTest to osobny skompilowany sterownik | snippet NOT-RUN |
| Compose / Android | sprawdzona; screenOrientation, saveable state | snippet NOT-RUN | NOT-RUN |
| React Native | sprawdzona; useWindowDimensions, Dimensions, ScrollView | snippet/typecheck NOT-RUN | NOT-RUN |
| WWW | sprawdzona; media query orientation, Screen Orientation API | własny HTML/JS załadowany w przeglądarce | zapisane resize/click/select/reset PASS w zakresie mechaniki |
Brak wykonania fragmentów edukacyjnych nie jest wyłączeniem platform ani automatycznym zleceniem czterech aplikacji.
Jak sprawdzić
- Ustal sprzęt, obsługiwane orientacje i systemowe ustawienie użytkownika. Wyłącz blokadę tylko za zgodą w obrębie próby; zachowaj stan do przywrócenia. Brak rotacji odróżnij od konfiguracji OS, usterki demonstracji i ograniczenia autora.
- Otwórz pion i oba wspierane poziomy; przeczytaj treść, wykonaj każdą istotną akcję, wróć do pionu. Zapisz orientację urządzenia osobno od ramki i orientacji UI. Powtórz start bezpośrednio w poziomie.
- Sprawdź źródła blokady: deklaracje hosta, kontrolery, runtime, CSS, JS i osadzona treść. Jeśli istnieje kontrolka zmiany orientacji treści, rzeczywiście jej użyj bez obrotu urządzenia.
- Dla ograniczenia oceń essential w konkretnym zadaniu. Zapisz brak równoważnej zgodnej drogi albo odrzuć wyjątek; nie akceptuj samej deklaracji autora.
- W WWW osobno sprawdź aspekt viewportu oraz, na obrotowym sprzęcie, rzeczywistą zmianę orientacji. Resize odtwarza bramkę CSS, ale nie tor czujnika.
Weryfikacja i ograniczenia
Historyczne wykonanie z 2026-10-04 obejmuje Flutter/Cupertino na iOS Simulator i autorską bramkę CSS w IAB/macOS. Nie obracano fizycznego telefonu.
| Sprawdzenie | Wynik i granica |
|---|---|
| Wymaganie i oficjalne API | Przegląd AI 2026-10-04; człowiek NOT-RUN |
| Flutter | Analiza PASS, nowy test i zestaw 57 testów hostowych PASS, świeży build/install iOS PASS |
| Mock kanału hosta | Potwierdza żądania orientacji i resize, bez dowodu skuteczności blokady |
| Zainstalowana aplikacja iOS | 1 XCTest / 0 failures, 93,122 s; 23 próbki, 47 wejść, 6 PNG |
| Good/control | Przy deviceOrientation 3/4 ramka 874 × 402; bad przy tym samym odczycie urządzenia utrzymuje 402 × 874 |
| Good | Pokaż/ukryj po landscapeLeft; landscapeRight potwierdza geometrię i zachowanie adresu, bez osobnego tap; powrót do pionu zachowuje adres |
| Start, cykl i reset | Dwa starty bezpośrednio w poziomie; reset rzeczywiście zmienia politykę; test przywrócił pion na końcu |
| Web | 13 odczytów, 5 JPEG; kliknięcia, select/reset, resize 402 × 874 ↔ 874 × 402 CSS px; good/control zachowują działanie, bad ukrywa main |
| Systemowa blokada, fizyczne WWW, Android, iPad, czytnik, człowiek | NOT-RUN; bez filmu lub audio i bez pomiaru płynności obrotu |
Świeża aplikacja miała identyczne hashe 65 plików build/install. Good/control obracały się w tej samej sesji co bad; nie przełączano blokady użytkownika. XCTest symulował orientację urządzenia, a resize webu badał aspekt viewportu. Są to różne wejścia.
Surowe iOS PNG mają IHDR 1206 × 2622; good/control po landscapeLeft mają EXIF Orientation=8 i odbiornik może pokazać 2622 × 1206. Bajty i metadane pozostały bez retuszu. Ramka XCTest potwierdza stan niezależnie od obsługi EXIF. Rozmiar JPEG webu nie jest pomiarem viewportu ani DPR.
Reguła statyczna może znaleźć lock, maskę, transformację lub ukrycie treści; musi uwzględnić nadpisania i odblokowanie na innej drodze. ACT b33eff bada określone transformacje CSS, więc bramka bez transformacji może być poza jej celem. Wynik „nie dotyczy” reguły nie rozstrzyga całego kryterium. Snapshot i AI nie odróżniają samodzielnie przyczyny OS od ograniczenia autora ani nie ustalają essential. Potrzebne są kontekst, ustawienia, źródła i rzeczywiste wejście.
Historyczny checker początkowo wymagał własnego pliku wyniku przed jego zapisaniem; poprawiony przebieg PASS bada integralność zapisów, nie ponownie UI. Pierwszy odczyt webu użył niedostępnego globalnego screen; późniejsze odczyty DOM nie ustaliły DPR i wersji silnika. Zaślepiony walidator oraz benchmark nie zostały wykonane.
Jak sprawdza Clearship
Clearship porównuje natywną trasę w pionie z odtworzeniem w jednym kierunku poziomu. Z odczytu urządzenia i viewportu aplikacji wskazuje blokadę; z tekstu drzewa — zastąpienie treści komunikatem. Deklarowany powód orientacji i niepełne obserwacje kieruje do człowieka, ponieważ reguła nie ustala niezbędności.
Metoda orientation-1 ma na Androidzie i iOS niespełniony próg pomiaru kontrolnego: 6/8 usterek, bez fałszywych alarmów w opisanych zestawach. Wynik pozostaje wskazówką do oceny człowieka. Nie obejmuje drugiego poziomu, obrotu w trakcie ekranu, powrotu z zachowaniem stanu, blokady OS użytkownika ani treści webowej. Działanie w poziomie sprawdza tylko krokami odtworzonej trasy.