High Contrast — 인터페이스 요소의 색상 대비를 높여 식별성을 개선하는 운영 체제의 접근성 모드입니다. iOS에서 Increase Contrast 기능은 Settings > Accessibility > Display & Text Size에 있으며 텍스트, 버튼 및 테두리의 대비를 개별적으로 강화할 수 있습니다. Android에서는 유사한 High Contrast Text 모드를 설정 > 접근성 > 고대비 텍스트에서 사용할 수 있습니다. 세계보건기구에 따르면 최소 22억 명의 사람들이 시각 장애를 가지고 있으며, 이들에게 High Contrast는 매우 중요합니다.
핵심 사항
High Contrast는 운영 체제 또는 애플리케이션이 전경색(텍스트, 아이콘)과 배경 간의 차이를 증가시키는 디스플레이 모드입니다. WCAG AA 표준에 따른 일반 텍스트의 최소 대비 비율은 4.5:1이며, 큰 텍스트(18pt 또는 14pt 굵게부터)의 경우 3:1입니다. 고대비 모드는 비율을 7:1 이상으로 높여 최대 가독성을 보장합니다.
단순히 배경을 어둡게 하거나 텍스트를 밝게 하는 것과 달리, High Contrast는 포괄적으로 작동합니다: 인터페이스 색상 팔레트를 제한된 고대비 색상 세트로 교체하고, 요소 주위에 윤곽선을 추가하며, 투명도를 제거합니다. 이 모드는 시력 저하, 광선 공포증 및 특정 형태의 색맹이 있는 사람들을 위해 설계되었습니다.
세 가지 유형의 High Contrast가 있습니다: 시스템 수준(OS에서 활성화되며 모든 애플리케이션에 영향), 앱 내(특정 애플리케이션 내 내장 모드) 및 웹 모드(CSS 미디어 기능 prefers-contrast)입니다. 시스템 수준의 High Contrast가 가장 강력하며, 자체 접근성 지원이 없는 애플리케이션에서도 색상을 재정의합니다.
High Contrast의 주요 사용자는 백내장(대비 감도를 낮추는 수정체 혼탁), 황반변성(중심 시력 상실), 녹내장 및 당뇨병성 망막증이 있는 사람들입니다. 이 모드는 밝은 햇빛 아래에서 작업할 때도 필요합니다 — 높은 대비가 화면 눈부심을 보정합니다. WebAIM(2025)에 따르면 웹 페이지의 86%가 WCAG AA 미만의 대비를 가진 텍스트를 가지고 있습니다 — 사용자 측의 High Contrast가 이 결함을 부분적으로 교정합니다.
iOS에서 Increase Contrast 기능은 Settings > Accessibility > Display & Text Size에 있으며 세 가지 독립적인 스위치가 포함됩니다: Increase Contrast(전반적 강화), Darken Colors(밝은 색상 어둡게), Reduce Transparency(투명도 감소)입니다. Increase Contrast는 주요 스위치이며 시스템 요소의 텍스트, 버튼 및 테두리에 영향을 미칩니다.
기술적으로 iOS는 tintColor 및 UIVisualEffectView 레이어를 통해 Increase Contrast를 구현합니다. 활성화되면 시스템은 어두운 톤의 알파 값을 증가시키고 밝은 톤에서는 감소시켜 모든 UI 요소의 대비 비율을 2~3포인트 높입니다. Reduce Transparency는 반투명 배경(젖빛 유리 효과)을 불투명으로 대체하여 흐릿한 배경에서 텍스트 가독성을 더욱 향상시킵니다.
개발자는 UIAccessibility를 통해 Increase Contrast 상태를 확인하고 그에 따라 색상을 조정할 수 있습니다. 예를 들어 대비가 증가된 경우 더 채도가 높은 악센트 색상을 사용할 수 있으며, 그렇지 않은 경우 기본 팔레트를 통해 기준 대비 비율 4.5:1을 보장해야 합니다. UIAccessibility.isReduceTransparencyEnabled는 모드가 활성화될 때 흐림 효과를 비활성화하는 데도 유용합니다.
import UIKit
class ContrastManager {
// Increase Contrast 상태 확인
static var isIncreaseContrastEnabled: Bool {
return UIAccessibility.isDarkerSystemColorsEnabled
}
// Reduce Transparency 확인
static var isReduceTransparencyEnabled: Bool {
return UIAccessibility.isReduceTransparencyEnabled
}
// 대비 모드에 맞게 색상 조정
static func adjustedAccentColor() -> UIColor {
guard isIncreaseContrastEnabled else {
return .systemBlue
}
// High Contrast 활성화 시 더 채도 높은 파란색
return UIColor(red: 0.0, green: 0.35, blue: 0.9, alpha: 1.0)
}
// Reduce Transparency를 고려한 배경색
static func backgroundColor() -> UIColor {
if isReduceTransparencyEnabled {
return .systemBackground // 불투명 배경
}
return UIColor.systemBackground.withAlphaComponent(0.85)
}
// 변경 사항 구독
static func observeChanges(observer: Any, selector: Selector) {
NotificationCenter.default.addObserver(
observer,
selector: selector,
name: UIAccessibility.darkerSystemColorsStatusDidChangeNotification,
object: nil
)
NotificationCenter.default.addObserver(
observer,
selector: selector,
name: UIAccessibility.reduceTransparencyStatusDidChangeNotification,
object: nil
)
}
}
// 사용 예: UINavigationBar
func applyContrastToNavigationBar(_ navBar: UINavigationBar) {
if ContrastManager.isIncreaseContrastEnabled {
navBar.isTranslucent = false
navBar.barTintColor = ContrastManager.backgroundColor()
navBar.titleTextAttributes = [
.foregroundColor: UIColor.label,
.font: UIFont.boldSystemFont(ofSize: 18)
]
}
}ContrastManager 클래스는 isDarkerSystemColorsEnabled를 통해 Increase Contrast 상태에 대한 액세스를 제공하고, 모드가 활성화되면 악센트 색상을 조정하며, navigationBar 투명도를 비활성화하고 대비 변경에 대한 시스템 알림을 구독합니다. UIKit은 UIAccessibility 상태가 변경되면 자동으로 요소를 다시 그립니다.
iOS는 Increase Contrast 모드에 자동으로 적응하는 동적 UIColor 색상(systemBackground, label, secondaryLabel)을 제공합니다. Increase Contrast가 활성화되면 시스템 색상이 값을 변경합니다: label은 더 어두워지고(또는 다크 모드에서 더 밝아짐), 배경은 투명도를 잃습니다. 개발자는 시스템 대비와의 충돌을 피하기 위해 모든 UI 요소에 동적 색상을 사용하는 것이 좋습니다.
Android에서 High Contrast Text 기능은 iOS와 다르게 작동합니다. 대비 비율을 부드럽게 증가시키는 대신 Android는 반전 색상 구성표를 적용합니다: 어두운 배경과 강조된 굵기의 흰색 텍스트입니다. 이 모드는 검은색이 최대 대비를 제공하는 AMOLED 디스플레이에서 특히 효과적입니다. 설정은 설정 > 접근성 > 시각 개선에 있습니다.
Android High Contrast Text는 두 가지 메커니즘을 사용합니다: 테마 오버레이를 통한 색상 팔레트 재정의와 비트맵 이미지의 대비를 높이기 위한 ColorMatrix 적용입니다. 시스템은 현재 애플리케이션 테마(라이트/다크)를 분석하고 최대 대비로 오버레이를 적용합니다: 검은색 배경(#000000)에 흰색 전경(#FFFFFF). 반투명 요소는 불투명 배경을 받습니다.
Android에서 High Contrast Text 상태를 확인하려면 AccessibilityManager와 ContentResolver를 사용합니다. API는 모드가 활성화되어 있는지 확인하고 UI를 조정할 수 있게 해줍니다. Jetpack Compose는 CompositionLocalProvider와 LocalContrast를 통한 적응을 지원합니다.
import android.accessibilityservice.AccessibilityService
import android.content.Context
import android.provider.Settings
import android.view.accessibility.AccessibilityManager
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
class HighContrastHelper {
// AccessibilityManager를 통한 확인
fun isHighContrastTextEnabled(context: Context): Boolean {
val am = context.getSystemService(
Context.ACCESSIBILITY_SERVICE
) as AccessibilityManager
return am.isEnabled && am.getEnabledAccessibilityServiceList(
AccessibilityService.FEEDBACK_ALL_MASK
).any { it.resolveInfo.serviceInfo.packageName ==
"com.android.server.accessibility" }
}
// 전역 설정을 통한 확인
fun isHighContrastFromSettings(context: Context): Boolean {
return try {
Settings.System.getInt(
context.contentResolver,
"high_text_contrast_enabled"
) == 1
} catch (e: Settings.SettingNotFoundException) {
false
}
}
// Jetpack Compose — 대비를 고려한 색상
@Composable
fun contrastAwareColors(): Pair<Color, Color> {
val context = androidx.compose.ui.platform.LocalContext.current
return if (isHighContrastTextEnabled(context)) {
Color.White to Color.Black
} else {
Color.Black to Color.White
}
}
}
// View 시스템: 동적 색상 선택기
class ContrastTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : AppCompatTextView(context, attrs) {
private val helper = HighContrastHelper()
override fun onAttachedToWindow() {
super.onAttachedToWindow()
if (helper.isHighContrastTextEnabled(context)) {
setTextColor(Color.WHITE)
setBackgroundColor(Color.BLACK)
setTypeface(getTypeface(), Typeface.BOLD)
}
}
}HighContrastHelper 클래스는 AccessibilityManager 및 시스템 설정을 통해 High Contrast 활성화 여부를 확인하고, Jetpack Compose에서 색상을 조정하며, View 시스템용 사용자 정의 ContrastTextView를 제공합니다. Android에서는 iOS와 달리 High Contrast 변경에 대한 직접적인 알림이 없습니다 — 동적 업데이트를 위해 Settings.System에 ContentObserver가 필요합니다.
Material Design 3(Material You)에는 Dynamic Color를 통한 내장 High Contrast 지원이 포함됩니다. 시스템 모드가 활성화되면 Material 3가 자동으로 최대 톤 팔레트를 선택합니다: background = Neutral0, onBackground = Neutral100, primary = Primary100. 개발자는 MD3 구성 요소만 사용하면 됩니다 — 시스템이 자동으로 대비 적응을 처리합니다.
WCAG 대비 비율은 텍스트 접근성을 평가하는 데 사용되는 두 색상 간의 휘도에 대한 수학적 비율입니다. 표준은 두 가지 임계값을 정의합니다: 일반 텍스트용 4.5:1(AA 수준) 및 큰 텍스트(18px/14px 굵게부터)용 3:1입니다. AAA 수준의 경우 일반 텍스트에 7:1, 큰 텍스트에 4.5:1이 필요합니다. High Contrast 모드는 이상적으로 7:1 이상을 제공해야 합니다.
대비 비율 계산은 공식(L1 + 0.05) / (L2 + 0.05)을 사용하여 수행되며, 여기서 L1은 더 밝은 색상의 상대 휘도, L2는 더 어두운 색상의 상대 휘도입니다. 상대 휘도는 sRGB 채널에서 가중치로 계산됩니다: 0.2126R + 0.7152G + 0.0722B입니다. 접근성 개발자의 경우 WebAIM Contrast Checker, Color Contrast Analyser 또는 Xcode의 Accessibility Inspector와 같은 도구를 사용하는 것으로 충분합니다.
| 수준 | 일반 텍스트 | 큰 텍스트(18px/14px 굵게) | UI 구성 요소 |
|---|---|---|---|
| AA | 4.5:1 | 3:1 | 3:1 |
| AAA | 7:1 | 4.5:1 | — |
| High Contrast iOS | ~7:1 | ~5.5:1 | 4.5:1 |
| High Contrast Android | ~10:1 | ~10:1 | 7:1 |
웹 애플리케이션에서 자동으로 대비 비율을 확인하려면 JavaScript를 사용할 수 있습니다. High Contrast 모드가 활성화된 경우 AA 표준을 충족하지 않는 요소를 강조 표시하는 것이 좋습니다. 다음은 JavaScript에서 상대 휘도 및 대비 비율 계산 예시입니다.
// WCAG 2.2에 따른 대비 비율 계산
class ContrastChecker {
// sRGB를 선형 공간으로 변환
linearize(channel) {
const s = channel / 255
return s <= 0.04045
? s / 12.92
: Math.pow((s + 0.055) / 1.055, 2.4)
}
// 상대 휘도
relativeLuminance(r, g, b) {
const R = this.linearize(r)
const G = this.linearize(g)
const B = this.linearize(b)
return 0.2126 * R + 0.7152 * G + 0.0722 * B
}
// 두 색상 간의 대비 비율
getContrastRatio(hex1, hex2) {
const rgb1 = this.hexToRgb(hex1)
const rgb2 = this.hexToRgb(hex2)
const L1 = this.relativeLuminance(rgb1.r, rgb1.g, rgb1.b)
const L2 = this.relativeLuminance(rgb2.r, rgb2.g, rgb2.b)
const lighter = Math.max(L1, L2)
const darker = Math.min(L1, L2)
return (lighter + 0.05) / (darker + 0.05)
}
hexToRgb(hex) {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16),
} : null
}
// AA 수준(4.5:1) 확인
passesAA(hex1, hex2) {
return this.getContrastRatio(hex1, hex2) >= 4.5
}
// AAA 수준(7:1) 확인
passesAAA(hex1, hex2) {
return this.getContrastRatio(hex1, hex2) >= 7.0
}
}
// 사용법
const checker = new ContrastChecker()
console.log(checker.getContrastRatio("#333333", "#FFFFFF"))
// → 13.2:1 (AAA)
console.log(checker.passesAA("#999999", "#FFFFFF"))
// → false (2.8:1)JavaScript의 ContrastChecker 클래스는 WCAG 2.2에 따른 완전한 대비 비율 계산을 구현합니다: sRGB를 선형 공간으로 변환, Rec.709 가중치로 상대 휘도 계산, AA/AAA 임계값과 비교. 이 도구는 High Contrast를 지원하는 웹 애플리케이션 개발 시 자동 색상 팔레트 감사에 유용합니다.
완성된 애플리케이션에서 대비 비율을 확인하려면 Accessibility Scanner(Android), Xcode Accessibility Inspector(iOS) 또는 axe DevTools(웹)를 사용하세요. 이러한 도구는 WCAG AA 미만의 대비를 가진 요소를 자동으로 찾아 강조 표시합니다. 감사 중에는 High Contrast 모드를 활성화해야 합니다 — 이를 통해 7:1 달성을 위한 시스템 대비 강화가 충분한지 확인할 수 있습니다.
CSS 미디어 기능 prefers-contrast를 통해 웹 페이지는 사용자의 시스템 대비 설정에 따라 스타일을 조정할 수 있습니다. 이 기능은 다음 값을 허용합니다: no-preference(기본값), more(사용자가 High Contrast를 활성화함), less(사용자가 낮은 대비를 선호함) 및 custom(미세 조정). 2022년부터 모든 최신 브라우저에서 지원됩니다.
prefers-contrast: more — 웹 개발자를 위한 신호: 텍스트 대비 비율 증가, 반투명 배경을 불투명으로 교체, 대화형 요소 테두리 강화, 저대비 배경 이미지 제거. iOS Safari와 Android Chrome은 시스템 High Contrast 모드(Increase Contrast / High Contrast Text)가 활성화되면 more 값을 전달합니다.
prefers-contrast: more가 활성화된 경우 웹 페이지는 색상 수를 최소화하고 강조를 위한 악센트 색상이 있는 흑백 팔레트를 선호해야 합니다. 다음은 색상 교체, 투명도 제거 및 테두리 강화를 포함한 CSS 적응 예시입니다.
/* 기본 스타일(no-preference) */
.card {
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(0, 0, 0, 0.1);
color: #333;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.button {
background: #0066CC;
color: #FFFFFF;
border: none;
padding: 12px 24px;
}
/* 고대비: more */
@media (prefers-contrast: more) {
.card {
background: #FFFFFF;
border: 2px solid #000000;
color: #000000;
box-shadow: none;
}
.button {
background: #004499;
outline: 2px solid #000000;
outline-offset: 2px;
}
.muted-text {
color: #000000; // #666이었다 — 이제 검은색
}
.overlay {
background: rgba(0, 0, 0, 0.8); // 0.4였다 — 강화됨
}
}
/* 저대비: less */
@media (prefers-contrast: less) {
.card {
border: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
}
}CSS 예시에서 prefers-contrast: more 아래에서 카드는 불투명한 흰색 배경, 2px 검은색 테두리를 얻고, 텍스트는 검은색(#333 대신 #000)이 되며, 버튼은 가시성을 위해 검은색 윤곽선이 있는 진한 파란색이 됩니다. prefers-contrast: less(드문 경우 — 사용자가 부드러운 색상을 선호함) 아래에서는 대신 대비가 감소합니다.
완전한 접근성 적응을 위해 prefers-contrast는 prefers-color-scheme(라이트/다크 테마)과 결합됩니다. prefers-color-scheme: dark와 prefers-contrast: more가 모두 활성화된 경우 색상은 밝은 악센트와 함께 검은색에 흰색이어야 합니다. 라이트 모드에서는 흰색에 검은색입니다. 이러한 미디어 기능의 조합은 완전한 접근성 커버리지를 위해 테스트해야 하는 4가지 조합을 제공합니다.
자주 묻는 질문
High Contrast — 시각 장애가 있는 사람들을 위해 인터페이스 요소의 색상 대비를 높이는 접근성 모드입니다. iOS에서 설정은 Increase Contrast(Settings > Accessibility > Display & Text Size)라고 하며, Android에서는 High Contrast Text(설정 > 접근성)입니다. 이 모드는 색상을 고대비 색상으로 교체하고, 투명도를 제거하며, 테두리를 강화합니다.
iOS에서 High Contrast를 확인하려면 UIAccessibility.isDarkerSystemColorsEnabled(Bool)를 사용하세요. 변경 사항을 추적하려면 UIAccessibility.darkerSystemColorsStatusDidChangeNotification을 구독하세요. UIKit은 모드가 활성화되면 동적으로 색상을 변경합니다 — 자동 적응을 위해 시스템 UIColor 색상(systemBackground, label, secondaryLabel)을 사용하세요.
Android High Contrast Text는 반전 색상 구성표를 적용합니다 — 강조된 굵기의 검은색 배경에 흰색 텍스트입니다. 이 모드는 대비를 높이기 위해 테마 오버레이와 ColorMatrix를 사용합니다. Material Design 3는 High Contrast가 활성화되면 자동으로 색상을 조정합니다 — 개발자는 Android 12+의 MD3 구성 요소와 Dynamic Color만 사용하면 됩니다.
WCAG는 대비 비율을 정의합니다: AA 수준은 일반 텍스트에 4.5:1, 큰 텍스트(18px 또는 14px 굵게부터)에 3:1이 필요합니다. AAA 수준 — 일반 텍스트에 7:1, 큰 텍스트에 4.5:1입니다. 계산은 Rec.709 가중치가 있는 sRGB 채널의 상대 휘도를 사용하여 공식(L1 + 0.05) / (L2 + 0.05)을 통해 수행됩니다.
CSS 미디어 기능 prefers-contrast: more는 시스템 High Contrast가 활성화될 때 웹 페이지가 대비를 높일 수 있게 합니다: rgba 배경을 불투명으로 교체, 테두리를 2px로 강화, 텍스트를 흰색 바탕에 검은색으로 만들기, box-shadow 비활성화. 다크 테마 + High Contrast에서 완전한 적응을 위해 prefers-color-scheme과 결합됩니다. 2022년부터 모든 최신 브라우저에서 지원됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.