Guideline 4.0
Guideline 4.0 - Design: Insufficient Color Contrast
Our Take
Apple flagged your app for insufficient color contrast between text and its background, or between interactive elements and their surroundings. Low contrast makes content difficult to read for users with normal vision and nearly impossible for users with low vision. Apple expects apps to meet accessibility contrast standards, particularly for text, buttons, and form fields.
Resolution Guide
**Audit all text colors** — Use Xcode’s Accessibility Inspector (Xcode → Open Developer Tool → Accessibility Inspector) to check contrast ratios across your app. You can also use online tools like WebAIM Contrast Checker.
**Meet WCAG AA minimums** — Ensure at least **4.5:1** contrast ratio for normal text (below 18pt) and **3:1** for large text (18pt+ or 14pt bold). Interactive elements need at least **3:1** against their background.
**Use semantic system colors** — Replace hardcoded color values with system colors that automatically provide proper contrast:
- `Color.secondary` / `UIColor.secondaryLabel` for secondary text
- `Color(.systemBackground)` / `UIColor.systemBackground` for backgrounds
**Fix text over images** — Add a semi-transparent scrim, shadow, or material blur behind text overlaid on images to guarantee readability regardless of the image content.
**Check both light and dark modes** — A color combination that passes in Light Mode may fail in Dark Mode, and vice versa. Test both.
**Support Increase Contrast** — Respect the `UIAccessibility.isDarkerSystemColorsEnabled` setting (or `@Environment(\.colorSchemeContrast)` in SwiftUI) and boost contrast when the user has enabled it.
**Document your contrast ratios** — In your reviewer notes, mention specific contrast ratios you’ve achieved for key elements.
Example Rejection Email
Consider Appealing
Do not appeal this rejection — the fix is straightforward and fast. Improving contrast benefits all users and is the right thing to do. Only appeal if you have measured your contrast ratios and they already meet WCAG AA and you believe the reviewer made an error.
Before & After
// Low contrast: light gray text on white — ratio ~1.6:1
Text("Important information")
.foregroundColor(Color(red: 0.8, green: 0.8, blue: 0.8)) // #CCCCCC
.background(Color.white)
// High contrast: semantic color — ratio 10:1 in light, 15.7:1 in dark
Text("Important information")
.foregroundStyle(.primary) // maps to UIColor.label
.background(Color(.systemBackground))
What changed: Color.primary / UIColor.label provides near-black text (#000000) in Light Mode and near-white (#FFFFFF) in Dark Mode, both with excellent contrast ratios against their respective system backgrounds.
// Text on image with no readability protection
ZStack {
AsyncImage(url: imageURL) { image in
image.resizable().scaledToFill()
}
Text(caption)
.foregroundColor(.white)
}
// Text on image with gradient scrim for guaranteed contrast
ZStack(alignment: .bottom) {
AsyncImage(url: imageURL) { image in
image.resizable().scaledToFill()
}
LinearGradient(
colors: [.clear, .black.opacity(0.7)],
startPoint: .center,
endPoint: .bottom
)
Text(caption)
.foregroundStyle(.white)
.padding()
}
What changed: A dark gradient scrim behind white text ensures readable contrast regardless of the underlying image content. The 0.7 opacity black provides roughly a 4.5:1 ratio with white text.
Community Solutions · 0
Sign in to share your solution.
More Guideline 4 (Design) rejections
- Guideline 4.0 - Design: App Does Not Include iOS Features
- Guideline 4.0 - Design: App Looks Like a Website
- Guideline 4.0 - Design: Apple Pay Button Not Following Guidelines
- Guideline 4.0 - Design: Blurry Icons or Low-Resolution Assets
- Guideline 4.0 - Design: Broken Layout on iPad
- Guideline 4.0 - Design: Content Clipped by Notch or Safe Area