Accessibility Label är namnet på gränssnittselementet som VoiceOver (iOS) eller TalkBack (Android) läser upp vid fokus. I iOS kallas egenskapen accessibilityLabel, i Android — contentDescription för element som inte innehåller text. Enligt Apple Developer Documentation, 2024är etiketten grunden för tillgänglighet: utan den kan användaren inte identifiera elementet. Etiketten måste vara unik inom skärmen och återspegla elementets kärna på ett begripligt språk.
Huvudpunkter
Accessibility Label är en strängegenskap som definierar elementets namn för hjälpmedelsteknik. När användaren drar fingret över skärmen med VoiceOver aktiverat, läser skärmläsaren upp Label för elementet som har fokus. Utan etikett hör användaren bara elementtypen: “knapp”, ”bild” — utan att ange syftet.
Enligt Google I/O 2024, “Accessibility Testing” är 35% av kritiska tillgänglighetsöverträdelser i butiksappar kopplade till avsaknad eller felaktighet av Label. Accessibility Scanner på Android upptäcker saknad etikett som ett fel av högsta allvarlighetsgrad.
Principiell begränsning: Label ska inte innehålla elementtypen. VoiceOver och TalkBack lägger automatiskt till rollen (button, header, link) i meddelandet. Om Label innehåller “Skicka-knapp” hör användaren: “Skicka-knapp, knapp” — dubbelarbete.
WCAG 4.1.2 (nivå A) kräver att varje element i användargränssnittet har ett programmatiskt bestämbart namn (name), roll (role) och värde (value). Accessibility Label tillhandahåller namnet. Om Label saknas anses kriteriet vara överträtt och applikationen klarar inte grundläggande certifiering.
I iOS ärvs accessibilityLabel av alla UIView från protokollet UIAccessibility. Om elementet innehåller text (UIButton med title, UILabel med text) ställs Label automatiskt in på denna text. För UIImageView, anpassade kontroller och behållare måste Label ställas in manuellt.
Exempel för en anpassad tabellcell:
class CustomTableViewCell: UITableViewCell {
let titleLabel = UILabel()
let priceLabel = UILabel()
override func awakeFromNib() {
super.awakeFromNib()
self.isAccessibilityElement = true
self.accessibilityLabel =
"\(titleLabel.text ?? "") - \(priceLabel.text ?? "")"
}
}
För anpassade UIView kan gettern för accessibilityLabel överskuggas:
class RatingView: UIView {
var rating: Int = 5
override var accessibilityLabel: String? {
get { return "Betyg: \(rating) av 5" }
set {}
}
}
Apple HIG, 2024 rekommenderar: om elementet består av flera under-element (t.ex. produktkort med namn och pris), kombinera dem till ett tillgänglighetselement med en sammansatt Label. Ställ in isAccessibilityElement = true på föräldern och false på barnen.
Om UILabel använder NSAttributedString är accessibilityLabel som standard lika med .string (ren text). Om du behöver skicka ett semantiskt annorlunda värde (t.ex. en ikon-symbol som läses som “Stjärna” istället för symbolen ★), ställ in accessibilityLabel explicit. VoiceOver läser inte Unicode-symboler på ett meningsfullt sätt.
I Android fungerar contentDescription som Label för ImageView, ImageButton och anpassade Vyer. För TextView och Button med inbyggd text behöver du inte ställa in contentDescription — TalkBack läser texten automatiskt.
Programmatisk inställning via Kotlin:
binding.iconStar.contentDescription = "Produkt i favoriter"
// För anpassad vy med flera element
binding.customCard.setContentDescription(
"\(title) till ett belopp av \(price)")
I XML för dekorativa element:
<ImageView
android:contentDescription="@null"
android:src="@drawable/divider"
android:importantForAccessibility="no" />
Egenskapen importantForAccessibility = "no" utesluter helt elementet från tillgänglighetsträdet. I iOS är motsvarigheten isAccessibilityElement = false.
I Jetpack Compose ställs Label in via modifieraren semantics:
Image(
painter = painterResource(R.drawable.ic_search),
contentDescription = "Produktsökning",
modifier = Modifier.semantics {
contentDescription = "Produktsökning"
}
)
I Compose är contentDescription en obligatorisk parameter för Image — utan den kompileras inte koden (varning). Detta tvingar fram förbättrad tillgänglighet genom API-design.
Accessibility Label besvarar frågan ”Vad är detta för element?”. Hint (accessibilityHint i iOS, extra text i contentDescription i Android) — ”Vad händer vid interaktion?”. VoiceOver uttalar dem sekventiellt: först Label, sedan Hint.
Exempel för raderingsknappen:
Enligt Deque University, 2024 ökar korrekt separation av Label och Hint framgångsfrekvensen för uppgifter för VoiceOver-användare med 28%. Användare med kognitiva funktionsnedsättningar är särskilt beroende av Hint: med risken att trycka på “Ta bort” utan förklaring avstår 40% från åtgärden.
Ett vanligt misstag: i Label skriver man “Radera-knapp” istället för “Ta bort”. Elementtypen (knapp) läggs automatiskt till av VoiceOver via trait. Som ett resultat hör användaren: “Radera-knapp, knapp” — dubbelarbete. Korrekt Label: “Ta bort”, Hint: “Tar bort det valda fotot”.
Lokalisering av etiketter är obligatorisk — sker via standardmekanismer: NSLocalizedString i iOS, strängresurser @string/ i Android. Ställ aldrig in Label genom sammanlänkning på engelska utan lokalisering.
Regler för en bra Label, baserade på W3C WCAG 2.2:
Använd en enhetlig ordlista för Label i applikationen. Om det på en skärm står “Favoriter” och på en annan “Bokmärken” blir användaren desorienterad. Skapa en tabell över tillgänglighetstermer — samordna med designers och lokaliserare.
För inmatningsfält (UITextField, EditText) ska Label överensstämma med platshållaren eller fältets rubrik. Platshållaren försvinner dock ofta efter textinmatning. Använd accessibilityLabel för det permanenta namnet och accessibilityValue för fältets aktuella innehåll — detta är standarden WCAG 4.1.2. Lösning: ställ in accessibilityLabel statiskt (lika med fältets rubrik) och accessibilityValue dynamiskt (lika med den inmatade texten). I iOS är detta automatiskt, men för anpassade fält — manuellt via överskuggning av accessibilityValue. Kontrollera att VoiceOver läser: “E-post, example@domain.com, textfält” istället för “, textfält”.
Automatiserad testning är det enda sättet att garantera att Label är korrekt på alla skärmar. iOS tillhandahåller XCUIApplication med åtkomst till .label, Android — AccessibilityCheckRule och setContentDescription.
Exempel på test för iOS:
func testLabelsAreUnique() {
let app = XCUIApplication()
app.launch()
let allButtons = app.buttons.allElementsBoundByIndex
let labels = allButtons.compactMap { $0.label }
let uniqueLabels = Set(labels)
XCTAssertEqual(labels.count, uniqueLabels.count,
"Dubblerade Label hittades")
}
Exempel för Android med Espresso:
@Test
fun testButtonHasAccessibilityLabel() {
onView(withId(R.id.btnSubmit))
.check(matches(
withContentDescription(containsString("Skicka"))
))
}
Manuell testning: aktivera VoiceOver (iOS) eller TalkBack (Android) och svep med en gest åt höger genom alla element på skärmen. Varje element bör få ett meningsfullt meddelande. Om du bara hör “knapp” eller ”bild” — Label saknas.
Efter att Label har konfigurerats kan VoiceOver-användaren använda rotorn för snabbnavigering: lägena “Knappar”, “Rubriker”, “Länkar” och andra. Om Label är korrekt inställt inkluderar VoiceOver elementet i motsvarande rotorläge. Kontrollera att alla knappar är synliga i läget “Knappar” och alla rubriker i “Rubriker”.
Label påverkar också VoiceOver-sökningen. Användaren kan ange ett ord i sökläget och VoiceOver flyttar fokus till elementet med matchande Label. Därför bör Label innehålla de nyckelord som användaren kommer att söka efter för att hitta elementet.
Lägg till Label-kontroll i pipelinen. På iOS, använd XCUITest med fastlane scan. På Android — Accessibility Test Framework med regeln AccessibilityCheckRule som upptäcker tomma contentDescription. Detta förhindrar regressioner vid sammanslagning av nya skärmar.
Vanliga frågor
Label identifierar elementet (“Sök”), Hint förklarar resultatet av åtgärden (”Öppnar sökskärmen”). VoiceOver uttalar Label omedelbart vid fokus och Hint i läget för detaljerade beskrivningar.
I iOS får UILabel automatiskt accessibilityLabel som är lika med dess text. Ytterligare inställning behövs inte. I Android fungerar TextView på samma sätt.
Ställ in isAccessibilityElement = true på den överordnade vyn och överskugga accessibilityLabel, returnera den sammanlänkade texten från underordnade element. För komplexa komponenter, använd sammanlänkning med separator.
Lägg till kontext till element som upprepas: “Köp iPhone 15”, “Köp iPhone 15 Pro”. Automatisera kontrollen genom UI-tester — samla alla Label och kontrollera att det inte finns några dubbletter.
Nej. För att dölja ett element, använd isAccessibilityElement = false i iOS eller importantForAccessibility = "no" i Android. En tom Label döljer inte elementet — skärmläsaren kommer att läsa “namnlös”.
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å