دسترس پذیری (Accessibility)
دسترس پذیری (Accessibility) یعنی اپ برای همه قابل استفاده باشد. یعنی دکمه ها، متن ها و ترتیب خواندن برای ابزارهای کمکی مثل VoiceOver واضح باشند. مثل زنگ مدرسه که همه می شنوند و پیامش روشن است.
VoiceOver و برچسب ها
همه عناصر تعاملی باید دیده و فهمیده شوند. برایشان برچسب (Label) و راهنما (Hint) بگذار.
import SwiftUI;
struct ContentView: View {
@State private var count: Int = 0;
var body: some View {
VStack(spacing: 12) {
Text("Count: \(count)")
.accessibilityLabel("Current count")
.accessibilityValue("\(count)");
Button("Increment") {
count += 1;
}
.accessibilityHint("Increases the count by one");
}
.padding();
}
}
در این نمونه، مقدار شمارنده هم برچسب دارد و هم مقدار خوانا.
اندازه پویا و کنتراست
از سبک های متنی سیستم استفاده کن و کنتراست رنگ را بررسی کن. همچنین به تنظیمات کاهش حرکت و افزایش کنتراست احترام بگذار.
نکته: با VoiceOver، متن بزرگ، متن بولد و حالت روشن/تیره تست کن. از Accessibility Inspector در Xcode کمک بگیر.
معناسازی و ویژگی ها (Semantics & Traits)
با ویژگی ها به ابزارهای کمکی بگو عنصرت چیست. سپس عناصر مرتبط را ترکیب کن تا یک اعلان واحد بشنوند.
import SwiftUI;
struct PlanBadge: View {
var body: some View {
VStack {
Image(systemName: "star.fill")
.foregroundStyle(.yellow)
.accessibilityLabel("Favorite")
.accessibilityAddTraits(.isImage);
Text("Premium plan");
}
.accessibilityElement(children: .combine);
}
}
اینجا خروجی به صورت «Favorite, Premium plan» یک جا خوانده می شود.
تمرکز، ترتیب و گروه بندی
ترتیب خواندن را کنترل کن و موارد مرتبط را کنار هم بچین. سپس در صورت نیاز آن ها را یکی اعلام کن.
import SwiftUI;
struct TotalRow: View {
var total: Double;
var body: some View {
HStack {
Text("Total")
.accessibilitySortPriority(2);
Text(total, format: .currency(code: Locale.current.currency?.identifier ?? "USD"))
.accessibilitySortPriority(1);
}
// یا به صورت یک اعلان ترکیب شود
// .accessibilityElement(children: .combine)
}
}
در این نمونه، می توان اول «Total» و بعد مقدار را خواند یا یکی کرد.
اکشن های سفارشی
اکشن های قابل تنظیم و نام دار را برای کاربران VoiceOver ارائه بده تا بدون لمس دقیق هم کار کنند.
import SwiftUI;
struct QuantityStepper: View {
@State private var qty: Int = 1;
var body: some View {
Stepper("Quantity: \(qty)", value: $qty)
.accessibilityValue("\(qty)")
.accessibilityAdjustableAction { direction in
switch direction {
case .increment:
qty += 1;
case .decrement:
qty = max(0, qty - 1);
default:
break;
}
}
.accessibilityAction(named: Text("Reset")) {
qty = 1;
};
}
}
گام های عملی
- 1) برای هر کنترل، Label و Hint بساز.
- 2) از Dynamic Type و کنتراست مناسب استفاده کن.
- 3) Traits درست بده و عناصر مرتبط را ترکیب کن.
- 4) اکشن های قابل تنظیم و نام دار اضافه کن.
- 5) با VoiceOver و Inspector تست نهایی بگیر.
نکته: چک لیست تست: برچسب، مقدار، راهنما، traits، ترتیب خواندن، اکشن ها، Dynamic Type، کنتراست، Reduced Motion.
جمع بندی سریع
- برچسب و مقدار را فراموش نکن.
- عناصر مرتبط را ترکیب کن.
- Dynamic Type و کنتراست مهم اند.
- اکشن های VoiceOver را فراهم کن.
- همیشه با VoiceOver تست کن.
مطالب مرتبط: دسترس پذیری، بومی سازی، MapKit.