접근성은 시각, 청각, 운동 장애가 있는 사용자도 앱을 사용할 수 있게 하는 것입니다. 법적 의무이자 좋은 UX의 기본입니다.


접근성 속성

TSX
// 기본 접근성 속성
<Pressable
  accessible={true}
  accessibilityLabel="프로필 편집"              // 스크린 리더가 읽는 텍스트
  accessibilityHint="프로필 정보를 수정합니다"    // 추가 설명
  accessibilityRole="button"                    // 요소의 역할
  accessibilityState={{ disabled: false }}       // 상태
  onPress={handleEdit}
>
  <Image source={editIcon} style={styles.icon} />
</Pressable>

// 이미지에 대체 텍스트
<Image
  source={{ uri: profileImage }}
  accessibilityLabel="홍길동님의 프로필 사진"
  accessible={true}
/>

// 장식용 이미지 (스크린 리더 무시)
<Image
  source={decorativeImage}
  accessible={false}
  accessibilityElementsHidden={true}
/>

accessibilityRole

Role설명
button탭 가능한 요소
link링크
header섹션 제목
image이미지
text텍스트
search검색 필드
switch토글 스위치
checkbox체크박스
alert알림 메시지
adjustable슬라이더 등 조절 가능 요소

동적 접근성 알림

TSX
import { AccessibilityInfo, Platform } from 'react-native';

// 스크린 리더에게 변경사항 알림
function announceChange(message: string) {
  if (Platform.OS === 'ios') {
    AccessibilityInfo.announceForAccessibility(message);
  }
  // Android는 accessibilityLiveRegion 사용
}

// 사용 예: 장바구니에 상품 추가 시
function addToCart(item: Product) {
  cart.add(item);
  announceChange(`${item.name}이(가) 장바구니에 추가되었습니다`);
}

// 실시간 업데이트 영역 (Android)
<View accessibilityLiveRegion="polite">
  <Text>장바구니: {count}개</Text>
</View>

스크린 리더 감지

TSX
function AccessibleComponent() {
  const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);

  useEffect(() => {
    AccessibilityInfo.isScreenReaderEnabled().then(setScreenReaderEnabled);

    const subscription = AccessibilityInfo.addEventListener(
      'screenReaderChanged',
      setScreenReaderEnabled
    );
    return () => subscription.remove();
  }, []);

  return screenReaderEnabled ? (
    // 스크린 리더용 간소화된 UI
    <SimpleLayout />
  ) : (
    // 일반 UI
    <RichLayout />
  );
}

접근성 체크리스트

  1. 모든 터치 요소에 accessibilityLabel 설정
  2. ** 아이콘 버튼에 텍스트 대체 제공**
  3. ** 최소 터치 타겟 44x44pt 확보** (hitSlop 활용)
  4. ** 색상 대비 비율 4.5:1 이상** (텍스트)
  5. ** 색상만으로 정보를 전달하지 않기** (에러 시 아이콘+텍스트 병행)
  6. ** 폼 에러 메시지를 스크린 리더에 알리기**
  7. ** 애니메이션 축소 설정 존중** (reduceMotion)
TSX
import { useReducedMotion } from 'react-native-reanimated';

function AnimatedComponent() {
  const reducedMotion = useReducedMotion();

  // 사용자가 동작 줄이기를 설정했으면 애니메이션 비활성화
  const animationDuration = reducedMotion ? 0 : 300;
}

정리

  • accessibilityLabel 은 스크린 리더 사용자를 위한 가장 기본적인 속성입니다
  • accessibilityRole 로 요소의 역할을 명시하면 스크린 리더가 적절히 안내합니다
  • ** 터치 타겟 44x44pt 이상 **을 확보하세요
  • ** 색상 대비 **와 ** 동작 줄이기 설정 **을 존중하세요
  • 접근성은 ** 모든 사용자의 UX를 향상 **시키며, 많은 국가에서 ** 법적 의무 **입니다
댓글 로딩 중...