VoiceOver — är Apples inbyggda skärmläsare (screen reader) som läser upp varje gränssnittselement och gör det möjligt att styra enheten med gester. Tekniken är inbyggd i iOS, iPadOS och macOS på systemnivå och kräver ingen installation av ytterligare programvara. Enligt Apple Accessibility (2025) stöder VoiceOver över 40 språk och används av miljontals blinda och synskadade användare över hela världen.
Huvudpunkter
VoiceOver — är en skärmläsare (screen reader) inbyggd i Apples operativsystem. Den är avsedd för blinda och synskadade användare och ger full interaktion med enheten utan visuell kontakt. VoiceOver läser upp alla gränssnittselement: knappar, länkar, text, bilder, aviseringar och systemelement.
Tekniken introducerades första gången 2005 för macOS och på iOS dök den upp med iPhone 3GS 2009. Sedan dess har VoiceOver blivit en integrerad del av Apples ekosystem och ett av de främsta argumenten för plattformens tillgänglighet. VoiceOver är inbyggt på systemnivå — det betyder att det fungerar i vilken app som helst utan ytterligare integration från utvecklaren, även om kvaliteten på uppläsningen direkt beror på hur väl appen använder iOS tillgänglighets-API.
VoiceOver stöder över 40 språk med naturlig talsyntes och anpassar sig till regionala röstinställningar. På iOS använder VoiceOver Siri-röstmotorer för svenska och andra språk, vilket ger så naturligt ljud och korrekt intonation som möjligt beroende på skiljetecken och sammanhang.
VoiceOver fångar upp beröringshändelser och tolkar dem annorlunda än standard iOS-inmatning. När användaren rör vid skärmen aktiverar VoiceOver inte elementet under fingret, utan läser först upp det. Först efter en dubbelberöring aktiveras elementet. Detta är den viktigaste skillnaden som gör att blinda användare kan utforska gränssnittet utan risk för oavsiktlig tryckning.
VoiceOver läser gränssnittselement i logisk ordning: från vänster till höger, uppifrån och ned. Läsordningen ärvs från iOS-vyernas hierarki, men utvecklaren kan ändra den via egenskapen accessibilityElements för komplexa layouter. Användaren kan navigera mellan element genom att svepa åt höger (nästa) och vänster (föregående), samt genom att trycka på ett specifikt element för att läsa upp det.
Vid varje förflyttning uttalar VoiceOver elementtypen (knapp, länk, rubrik), dess namn (accessibilityLabel), status (vald, inaktiverad) och ledtråd (accessibilityHint). Om elementet innehåller ett värde — till exempel en volymreglage — läser VoiceOver även upp det. Tillgänglighetsegenskaper (UIAccessibilityTraits) informerar dessutom användaren om elementets beteende: om det är en knapp, växel, sökning eller tangentbordstangent.
Rotorn — är ett virtuellt inställningshjul som växlar VoiceOver-navigeringsläge. Användaren vrider på rotorn med två fingrar (som ett volymhjul) och väljer läge: ord, tecken, rubriker, länkar, ingångspunkter, tabellrader och andra. Rubrikläge gör det möjligt att snabbt växla mellan H1-H6 på webbsidor och i appar, och teckenläge — att uttala text bokstav för bokstav, vilket är användbart vid ifyllning av formulär eller inmatning av bekräftelsekoder.
Utvecklaren kan lägga till egna lägen i rotorn via UIAccessibilityCustomRotor API. Till exempel i en anteckningsapp kan man lägga till rotorn „Favoritanteckningar" eller „Senaste ändringar". Anpassade rotorer påskyndar navigeringen avsevärt i specifika appar och anses vara bästa praxis för tillgänglighet på iOS.
VoiceOver använder sin egen uppsättning gester som inte överensstämmer med standard iOS-gester. De flesta gester utförs med tre fingrar istället för ett — detta förhindrar konflikter med vanlig styrning och låter VoiceOver fungera samtidigt med standardinmatning.
| Åtgärd | Gest | Resultat |
|---|---|---|
| Läs upp element | Beröring med 1 finger | Uttalar elementets namn |
| Aktivera | Dubbelberöring | Tryck på knapp eller länk |
| Nästa element | Svep åt höger | Gå till nästa |
| Föregående element | Svep åt vänster | Tillbaka till föregående |
| Rulla | 3 fingrar svep | Rulla lista eller sida |
| Rotor | 2 fingrar vridning | Ändra navigeringsläge |
Gestet dubbelberöring är det primära sättet att aktivera element i VoiceOver. Om ett element kräver en speciell åtgärd (till exempel dragning), använder VoiceOver sekvensen „beröring — dubbelberöring och håll" för att gå in i flyttläge. Detta gör det möjligt att utföra komplexa gester som drag-and-drop utan att titta på skärmen. VoiceOver stöder också gesten „dubbelberöring med två fingrar" för att avbryta en åtgärd och „trippelberöring" för att aktivera/avaktivera skärmgardinen (Screen Curtain).
En iOS-apputvecklare kan avsevärt förbättra interaktionen med VoiceOver via UIAccessibility API. Grundläggande tillgänglighetsinställningar läggs till i Interface Builder (Identity Inspector → Accessibility), men för komplexa gränssnitt krävs programmeringskonfiguration i kod.
Egenskapen accessibilityLabel anger texten som VoiceOver uttalar för ett element. Om etiketten inte är inställd använder VoiceOver knapptexten eller textfältets platshållare. För element utan text (ikoner, anpassade vyer) är etiketten obligatorisk. Egenskapen accessibilityTraits bestämmer elementtypen: knapp, rubrik, växel, sökning, tangentbordstangent, föränderligt värde, länk och andra.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Användarprofil"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Öppnar skärmen för profilinställningar"
Flaggan isAccessibilityElement aktiverar VoiceOver-stöd för anpassade vyer — som standard är den true endast för standardelement (UIButton, UILabel, UITextField). Parametern accessibilityHint lägger till en ledtråd: VoiceOver uttalar den efter en paus om användaren stannar vid ett element. Hint bör beskriva resultatet av åtgärden, inte instruktionen: „Öppnar inställningsskärmen" istället för „Tryck för att öppna".
För komplexa skärmar där den logiska gruppen av element inte överensstämmer med den visuella ordningen, används accessibilityElements — en array som bestämmer läsordningen. Till exempel innehåller ett produktkort bild, namn, pris och knappen „Lägg i varukorg". Om dessa element är kaotiskt placerade i vyhierarkin, anger accessibilityElements rätt ordning för VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
För att kombinera flera element till ett tillgängligt element används UIAccessibilityContainer eller accessibilityFrame för att åsidosätta beröringsområdet. Detta är användbart när en tabellcell innehåller flera UI-komponenter, men logiskt representerar ett element — VoiceOver bör läsa upp hela cellen som en helhet, inte bläddra igenom dess innehåll separat.
Korrekt tillgänglighetskonfiguration för VoiceOver kräver uppmärksamhet på flera aspekter: semantisk markup, dynamiska uppdateringar, hantering av anpassade element och testning med en riktig screen reader.
I SwiftUI konfigureras tillgänglighet via modifierare .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() och .accessibilityAddTraits(). SwiftUI ärver automatiskt tillgänglighet från standardelement, men för anpassade komponenter krävs explicit konfiguration. Till exempel måste en anpassad reglage informera VoiceOver om sitt värde och ändringsformat.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Ljudvolym")
.accessibilityValue(
Text("\(Int(volume)) procent")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Modifieraren accessibilityAdjustableAction lägger till möjligheten att ändra värdet med VoiceOver-gester: svep uppåt — öka, svep nedåt — minska. Utan denna modifierare förblir reglaget otillgängligt för styrning via screen reader. Liknande konfiguration krävs för anpassade steppers, pickers och andra element som ändrar sitt värde.
När innehållet på skärmen ändras dynamiskt (en avisering visas, laddningsstatus uppdateras, priset ändras), bör VoiceOver få ett meddelande via UIAccessibility.post. Utan detta anrop kommer screen readern inte att känna till ändringarna och användaren kommer att missa viktig information. För SwiftUI används modifieraren .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Priset sänkt med 20 procent"
)
// SwiftUI
Text("Priset uppdaterat")
.accessibilityAnnouncement(Text("20% rabatt"))
VoiceOver-aviseringar bör användas med omdöme: överdrivna tillkännagivanden irriterar användaren, medan deras frånvaro gör appen otillgänglig. Den optimala strategin — meddela endast ändringar som påverkar användarens aktuella arbetsflöde: varukorgsuppdatering, laddningsstatus, formulärvalideringsfel, chattmeddelande. Bakgrundsändringar (tid på fältet, växelkurs) kräver inget meddelande — användaren kontrollerar dem själv vid behov.
VoiceOver-testning utförs via en fysisk enhet med påslagen screen reader eller iOS-simulatorn med alternativet Accessibility Inspector. Det är viktigt att testa fullständiga användningsscenarier: utan visuell kontroll genomföra registrering, lägga en order, hitta en produkt via sökning. Om vägen är framkomlig utan visuell feedback — är VoiceOver korrekt konfigurerad.
Vanliga frågor
Inställningar → Tillgänglighet → VoiceOver. Slå på reglaget. För snabb aktivering används trippeltryck på sidoknappen (på iPhone X och nyare) eller Hem-knappen. Siri kan också slå på VoiceOver med kommandot „Sätt på VoiceOver".
VoiceOver — Apples skärmläsare för iOS, TalkBack — Googles skärmläsare för Android. Arbetsprincipen är densamma: beröring läser upp, dubbelberöring aktiverar. Skillnaden ligger i gester, rotorinställningar och ekosystemintegrationer: VoiceOver är djupare integrerad med iCloud och Apple Pay.
Använd UIAccessibility API: ställ in accessibilityLabel för alla element, accessibilityTraits för elementtypen och accessibilityHint för ledtrådar. I SwiftUI använder du modifierarna .accessibilityLabel() och .accessibilityAddTraits(). Testa appen med påslagen VoiceOver.
Rotorn — är ett navigeringsläge som växlas genom att vrida två fingrar. Det bestämmer hur man rör sig mellan element: efter rubriker, tecken, ord, länkar eller ingångspunkter. Utvecklare kan lägga till egna lägen via UIAccessibilityCustomRotor.
För anpassade UIView:er måste du ställa in isAccessibilityElement = true och ange accessibilityLabel. Om elementet består av flera underordnade vyer, använd accessibilityElements för att bestämma läsordningen eller kombinera dem i en behållare.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också