본문 바로가기
Programming 개발은 구글로/Web[프론트엔드&백엔드]

iOS VoiceOver trait 기능 사용

by 40대직장인 2023. 5. 10.

iOS VoiceOver trait 기능 사용

 

 

 

Trait란 VoiceOver가 인식하는 컨트롤 타입을 임의로 지정해주는 기능으로 WAI-ARIA의 Role과 유사합니다. 

VoiceOver에게 특정 요소의 컨트롤 타입을 지정해 주는 것뿐만 아니라 보이스오버의 동작에까지 영향을 줍니다. 

 

이러한 trait를 잘만 활용하면 애플리케이션의 여러 요소들이 가지는 의미나 기능을 명확하게 스크린리더 유저에게 전달해줄 수 있습니다. 다만 이러한 trait를 잘못 사용하면 의도치 않은 오동작이 수행되어 더욱 큰 혼란을 줄수 있습니다.


None (UIAccessibilityTraitNone)

만약 임의의 애플리케이션 요소 중 이미지 요소 또는 버튼과 같은 컨트롤이 있지만 해당 요소 타입을 스크린리더가 인식하지 않도록 할 경우 (UIAccessibilityTraitNone)을 사용합니다. 

 

그러면 이 요소의 레이블 외에는 부여된 속성을 음성출력하지 않습니다. 이 trait는 모든 요소를 제거하는 것이므로 다른 트레이트와 함께 사용할 수 없습니다.



Button (UIAccessibilityTraitButton)
이 Trait는 버튼 컨트롤을 사용하지 않은 속성이 버튼으로 인식되어야 할 때 사용합니다. 커스텀 컨트롤이라 하더라도 버튼 trait를 적용하면 VoiceOver는 해당 요소의 타입을 버튼으로 인식/출력합니다. 버튼은 이벤트를 받을 수 있는 액션이 표함되어야 하므로 액션 이벤트를 가지지 않은 경우에는 버튼 trait가 적절하지 않습니다.



Link (UIAccessibilityTraitLink)
(UIAccessibilityTraitLink)는 사파리 웹 브라우저를 통해 특정 웹 페이지에 접속하도록 동작하는 요소에 사용합니다. 즉 임의의 애플리케이션에 포함된 여러 요소 중 선택했을 때 특정 웹 페이지로 이동하는 요소는 해당 Trait를 사용함으써 VoiceOver가 링크로 인식되도록 해야 합니다.



검색필드 (UIAccessibilityTraitSearchField)
일반적으로 텍스트 필드(입력 창)에는 이메일주소, 성명과 같이 각각의 입력 창의 목적에 적합한 레이블을 명확하게 제공해야 합니다. 그러나 검색어를 입력하는 텍스트 필드에 검색 필드 trait를 적용하면 '검색'이라는 레이블을 삽입하지 않아도 검색어를 입력하는 입력 창임을 VoiceOver가 출력합니다.



Selected (UIAccessibilityTraitSelected)
이 Trait는 탭 영역과 같이 특정 요소가 선택되었음을 표시할때 사용합니다.



Summary Element (UIAccessibilityTraitSummaryElement)
위에서 열거한 Trait와는 달리 summary element는 한 손가락 쓸기 혹은 터치한 상태로 탐색했을 때 이 Trait가 적용된 요소에는 포커스가 위치할 수 없습니다.

 

summary element의 목적은 애플리케이션이 로딩될 때 첫 화면에서 사용자에게 알려주어야 할 내용을 VoiceOver가 자동으로 음성 출력하도록 하는 것입니다.

이 trait는 앱의 첫 화면에서만 사용 가능하며 하나의 view에서 하나의 summaryElement만 적용할 수 있습니다.

 

Facebook 앱을 로딩했을 때 새 알림이 있을 경우 ‘알림, 새 항목 x개’라고 음성출력하는데 이러한 것이 summary trait가 적용된 대표적 예시입니다.



User Interaction Enabled (UIAccessibilityTraitNotEnabled)
현재 액션을 가지고 있는 버튼이 사용불가일 때 사용합니다. 이 trait를 사용하면 보이스오버는 ‘흐리게 표시됨’이라고 음성출력하여 버튼이 활성화되지 않았음을 알려줍니다.

인터페이스 빌더에서는 이 trait가 “User Interaction Enabled”라고 표시되는 반면에

직접 코딩하여 적용할 때 UIAccessibilityTraitNotEnabled를 사용합니다. 

따라서 인터페이스빌더에서는 해당 항목이 체크해제되어 있어야 이 trait를 적용하는 것이 됩니다.

텍스트나 이중탭해도 액션 자체가 없는 객체에서는 적용하지 않으며 특정 버튼이 조건에 의해 비활성화됨을 알려주어야 할 경우 사용하면 됩니다.



Frequent Updates (UIAccessibilityTraitUpdatesFrequently)
퍼센트가 증가하거나 시간이 증가하는 등 실시간 내용이 업데이트 되는 객체를 보이스오버가 어떻게 다룰 것인가를 적용하는 속성입니다.

 

이 trait를 적용하지 않으면 콘텐츠는 계속 업데이트 되더라도 보이스오버는 처음 포커스 되었을 때의 값을 계속 음성출력하게 됩니다.

그러면 사용자는 업데이트 되는 내용을 제대로 인지할 수 없습니다.

 

그러나 이 trait를 적용해주면 포커스를 고정하더라도 콘텐츠가 업데이트되는 내용을 보이스오버가 바로 캐치하여 음성출력하게 됩니다. 시계 > 스톱워치에서 이 속성이 적용된 실재 예시를 확인할 수 있습니다.

해당 trait는 dynamic notification과 같이 포커스를 갖지 않은 객체에도 적용할 수 있습니다. 

그렇게 되면 포커스가 다른 곳에 있더라도 업데이트 되는 콘텐츠를 음성출력하게 됩니다. 

즉 포커스를 가지는 객체에 적용했을 때에는 그 객체에서 포커스를 벗어나면 그 객체의 갱신되는 콘텐츠는 음성출력하지 않습니다.



Starts Media Session (UIAccessibilityTraitStartsMediaSession)
특정 버튼을 이중 탭 했을 때 화면은 변하지 않고 짧은 사운드 이벤트가 재생되는 버튼이 있다고 가정해 봅시다. 

버튼을 눌렀을 때 포커스의 변화가 없다면 보이스오버는 선택한 버튼의 레이블을 다시 한번 음성출력하게 됩니다. 

 

그러나 재생되는 사운드가 짧고 중요한 사운드라면 이러한 보이스오버의 음성이 방해가 될 수 있습니다. 

 

상황에 따라 개발자는 이런 경우 사운드에 집중하도록 하기 위하여 보이스오버의 음성을 해당 버튼을 이중 탭 했을 때 출력하지 않도록 할 수 있는데 이것이 사운드세션 trait를 적용하는 것입니다. 

 

사운드가 출력되는 모든 객체에 이러한 trait를 적용하기보다는 중요한 이벤트를 알리는 용도로 사운드가 사용된 경우, 그리고 이중 탭 한 레이블의 이름이 바뀌지 않는 경우에만 사용해야 합니다. 

 

예를 들어 일반적인 뮤직 플레이어에서 재생을 누르면 버튼은 일시정지로 바뀝니다. 

이때 만약 media session trait를 적용하면 재생이 실행되면서 일시정지로 바뀐 버튼명을 바로 들을 수 없고 다시 탭해서 변경된 사항을 확인할 수 있습니다.



Adjustable (UIAccessibilityTraitAdjustable)
UISLIDER 컨트롤에만 적용하는 trait로서 위 또는 아래로 한 손가락 쓸기로 값을 조절할 수 있도록 하는 기능을 합니다. 

 

이중 탭 한 상태로 슬라이드를 해서 값을 조절할 경우 상황에 따라 조절 값을 맞추기 어려울수 있으나 위아래 쓸기로 조절하게 되면 일정 숫자 단위로 이동하므로 어느 정도 세밀한 조절이 가능합니다. 

 

이 trait가 적용되면 포커스 시에 다른 로터 옵션으로 선택되어 있더라도 값 조절 로터로 변경되며 값 조절이 가능하다는 힌트 메시지가 출력됩니다.



Direct Interaction (UIAccessibilityTraitAllowsDirectInteraction)
보이스오버를 켜면 모든 화면에 있는 객체들은 보이스오버 제스처의 영향을 받습니다. 

그러나 그림을 그리는 영역, 악기를 연주하는 영역과 같이 보이스오버의 제스처들이 무시되어야 하는 영역이 있을 수 있습니다. 

 

이것은 마치 일반적인 스크린리더에서 스크린리더의 기능키를 일시 중지하는 것과 같습니다. 

 

앱의 특성에 따라 특정 영역에 direct interaction trait를 적용하면 그 영역은 보이스오버의 터치 기능을 무시하고 동작하여 탭, 그리기 등이 가능하게 됩니다. 

 

GarageBand 앱의 키보드 연주 섹션에서 관련 trait가 적용된 예를 확인할 수 있습니다.



머리말 (UIAccessibilityTraitHeader)
특정 요소가 제목을 의미할 때 사용할 수 있습니다. 이 trait를 사용하면 보이스오버는 레이블 뒤에 ‘머리말’이라고 음성출력합니다. 

 

이러한 머리말 요소는 사용자가 제목 요소임을 쉽게 구분할 수 있도록 해줄뿐만 아니라 한 스크린에 여러 제목이 있을 경우 머리말 로터를 통하여 머리말 단위로 빠르게 이동할 수 있습니다. 

 

하나의 view에 적어도 하나의 머리말은 써주는게 좋습니다.



이미지 (UIAccessibilityTraitImage)
커스텀 컨트롤을 사용한 프로필이나 사진을 나타내는 경우에 적용할 수 있습니다. 

 

이 trait를 사용하면 보이스오버는 레이블 뒤에 ‘이미지’라고 음성출력합니다. 이미지가 단순한 디자인적 요소로 사용된 경우에는 이러한 정보를 제공해 주지 않아도 됩니다.



키보드 (UIAccessibilityTraitKeyboardKey)
보안키보드와 같이 커스텀 키보드를 사용할 때 적용할 수 있습니다. 

 

기본적으로 표준 키보드에서는 보이스오버 사용자가 입력할 때 각 키를 이중 탭 해서 입력하는 표준입력, 손가락을 터치한 상태로 특정 키에서 손을 떼면 바로 입력되는 터치입력 옵션 등을 조절할 수 있는데 커스텀 키보드에서는 기본적으로 이중 탭 하여 입력하는 것 외에는 다른 옵션이 작동하지 않습니다. 

 

따라서 이러한 키보드에 키보드키 trait를 적용하면 마치 일반 키보드인 것처럼 동작하여 로터 옵션에서 입력 방식을 조절할 수 있게 됩니다.



자동 페이지 넘기기 (UIAccessibilityTraitCausesPageTurn)
여러 페이지로 구성된 문서에서 두 손가락 아래로 쓸기를 이용하여 연속으로 텍스트를 읽을 필요가 있거나 점자 디스플레이에서 이동 시 페이지 넘기기가 활성화된 상태로 텍스트를 읽어야 할 경우 이 trait를 적용할 수 있습니다. 

 

그러면 한 화면의 텍스트를 다 읽으면 수동으로 페이지를 넘겨주지 않아도 자동으로 다음 페이지로 넘어가면서 텍스트를 연속적으로 읽을 수 있습니다. 

 

iBooks와 Google 플레이북에서 이 trait의 실재 예를 확인할 수 있습니다.



여러 trait 동시 사용
지금까지 iOS VoiceOver에서 적용할 수 있는 여러 trait 속성들에 대해 살펴보았습니다.

 

이러한 trait는 상황에 따라 두 개를 동시에 사용할 수도 있습니다. 

 

예를 들어 어떤 요소가 제목이면서도 실행할 수 있는 액션 이벤트를 포함하고 있다면 제목(머리말)인 동시에 액션(버튼)을 포함하고 있어야 합니다.
따라서 trait를 적용할 때 각 요소의 의미를 정확히 파악하고 적절한 trait를 적용해 주어야 합니다.

이러한 속성은 ‘미리알림’ 애플리케이션에서 테스트해볼 수 있습니다.

 

 


출처: NULI - 커뮤니티(아티클)

 

 

 

댓글