Skip to content

기술 | VoiceOver

JiYoung Park edited this page Nov 3, 2023 · 27 revisions

📣 UIAccessibility 란?

UIAccessibility는 NSObject 타입의 확장으로, 모든 뷰에서 사용할 수 있습니다.

extension NSObject {
    open var isAccessibilityElement: Bool
    open var accessibilityLabel: String?
    open var accessibilityHint: String?
    open var accessibilityValue: String?
    open var accessibilityTraits: UIAccessibilityTraits
}

📋 보이스오버에서 읽어 주는 UIAccessibility 순서

Label -> Value -> Traits -> Hint


✅ UIAccessibility 기본 요소


accessibilityElement

보이스오버 모드에서 읽어 주어야 할 component들을 지정합니다. 일반적으로 Array에 담아 사용하며, 배열에 담긴 순서 대로 VoiceOver 모드에서 읽어줍니다.

[코딩동에서의 예시]

view.accessibilityElements = [titleLabel, bottomView, nextButton]

[일반적인 예시]

let elements = [header1, button1, button2, button3, button4, button5, button6, button7, button8, button9, header2, focusButton, header3, longPressLabel, header4, announcementButton, header5, imageView]
view.accessibilityElements = elements as [Any]

accessibilityLabel

accessibilityLabel은 VoiceOver 모드에서 어떻게 읽어주어야 할 지 설정해 주는 이름을 붙여주는 작명가 역할을 수행합니다. 예를 들어 코딩동에서 홈 버튼 사용한 books.vertical 의 경우 SF symbol 그 자체의 이름은 book.vertical로 읽히지만, 내 책장으로 읽히도록 라벨링하였습니다. 애플 공식 가이드 라인에 따르면 좋은 Label 의 조건에는 다음과 같은 5가지가 있다고 합니다.

  1. 매우 간결하게 요소를 설명하라: 하나의 단어로 구성하는 게 좋습니다.
  2. 타입을 포함하지 말아라!
    • Trait에서 이미 해당 요소에 대한 속성, 이를 테면 버튼, 머릿말이라든지에 대한 설명을 포함하고 있기 대문에 중복을 피하기 위해서라고 합니다.
    • 예를 들어 "더하기 버튼" 이라고 이름을 지으면 보이스오버 모드에서 항상 '더하기 버튼(Label) 버튼(Trait)'로 읽히기 때문에 피하는 게 좋습니다.
  3. 대문자로 시작하라: 영문일 경우, 보이스 오버가 더 적절하게 읽을 수 있어서라고 합니다.
  4. 마지막을 마침표로 끝내지 말라: Label은 문장이 아니기 때문에 마침표로 끝내지 않는 게 좋습니다.
  5. 현지화하라: 보이스오버는 사용자가 내부 설정한 언어에 따라 읽어주기 때문에 현지화하도록 합시다.

accessibilityValue

accessibilityLabel이 작명가의 역할이라면 accessibilityValue는 명명한 사물의 세부적인 특징을 묘사 사용합니다. 이를 테면, UISlider에서 해당 요소를 표기할 때는 accessibilityLabel 을 통해 슬라이더라고 이름 붙이겠지만, 그 세부값을 표기할 때는 accessibilityValue를 통해 60% 라고 표시할 수 있습니다. accessibilityValue 는 항상 사용하는 게 아니라 세부 특징 묘사가 필요한 경우, 이를 테면 UISlider에서 을 표기하거나 TextField 안에 있는 text를 표시할 때 사용합니다.


accessibilityTraits

해당 요소의 특징을 설명합니다. 다음은 accessibilityTraits 에서 사용할 수 있는 특성들입니다.

Button
Link
Search Field
Keyboard Key
Static Text
Image
Plays Sound
Selected
Summary Element
Updates Frequently
Not Enabled
None

accessibilityHint

힌트는 해당 컴포넌트의 액션에 대한 결과를 나타낼 때 사용합니다. 힌트는 반드시 label만으로 결과를 나타내기 어려울 경우에만 사용합니다 . 예를 들어, '노래 제목' 을 클릭했을 때, 노래가 재생되도록 하고 싶은 경우, 노래 제목(이미 Label을 통해 해당 라벨에 대한 힌트를 주고 있는 상태)만으로는 사용자가 해당 컴포넌트의 결과를 어렵기 때문에 '노래 재생하기'란 힌트를 추가해 줄 수 있습니다.
애플 공식 가이드 라인에 따르면 좋은 Hint 의 조건에는 다음과 같은 7가지가 있다고 합니다.

  1. 매우 간결하게 결과를 표현하라

    • 사용자가 해당 요소를 사용하기 전, 사용법에 대한 설명을 듣는 데 소요되는 시간을 줄여주는 게 좋습니다.
    • 그렇다고 해서 문법적으로 틀린 문장을 쓰라는 것은 결코 아닙니다. 예를 들어 "떡 추가" 보다 "떡들을 추가" 가 더 옳은 문장입니다.
  2. 동사로 시작하고, 주어를 생략해 줍니다.

    • 명령형의 어조보다 친구한테 설명을 한다고 생각하고 써 주세요.
  3. 시작은 대문자로 시작하고, 맺을 때는 온점(.)을 사용합니다.

  4. 액션이나 제스처의 명칭을 포함하지 않습니다.

    • 힌트는 사용자로 하여금 해당 행동을 하도록 유도하기 보다, 그 행동의 결과가 어떻게 될 지 사용자로 하여금 암시하기 위해 사용합니다.
    • 따라서 노래를 재생하기 위해 탭해 주세요, 구입하기 위해 탭하세요, 삭제하기 위해 스와이프 하세요바람직 하지 못한 힌트들입니다.
    • 보이스 오버에서 사용자들은 이미 보이스 오버 모드에서 특화된 제스처들을 잘 알고, 사용하고 있습니다. 따라서 힌트에서 제스처에 대한 이름을 포함한다면, 사용자들은 매우 혼란스러울 것입니다.
  5. 컨트롤이나 뷰의 명칭을 포함하지 않습니다.

    • 사용자는 이미 label을 통해 정보를 습득할 수 있습니다. 때문에 힌트에서는 해당 라벨에 대한 특성을 반복해 주지 않는 게 좋습니다.
    • 따라서 '저장은 당신이 편집한 것은 저장해 줍니다' 라든지, '이전으로는 이전 화면으로 이동하게 해 줍니다' 라는 것들을 모두 불필요한 힌트들입니다.
  6. 컨트롤이나 뷰의 타입을 포함하지 않습니다.

    • 사용자들은 이미 trait를 통해 해당 요소가 버튼인지, 검색창인지 어떻게 작동하는지를 압니다.
    • 때문에 '이름을 추가하는 버튼', '확대하는 슬라이더' 라든지 하는 힌트는 모두 사족입니다.
  7. 현지화하라: Accessibility의 라벨을 만들 때는 유저가 선호하는 언어에 맞게 구성되어야 합니다.


👆🏻 UIAccessibilityCustomAction

업데이트 예정

👣 UIAccessibilityNotification


📱 VoiceOver Inspector 사용 방법

STEP1 STEP2
스크린샷 2023-11-03 오전 11 47 41 스크린샷 2023-11-03 오전 11 51 44

📚 참고 문서