VoiceOver — صفحهخوان داخلی (screen reader) اپل است که هر عنصر رابط را صداگذاری میکند و به شما امکان میدهد دستگاه را با حرکات کنترل کنید. این فناوری در سطح سیستم در iOS، iPadOS و macOS تعبیه شده است و نیازی به نصب نرمافزار اضافی ندارد. به گفته Apple Accessibility (2025)، VoiceOver از بیش از ۴۰ زبان پشتیبانی میکند و توسط میلیونها کاربر نابینا و کمبینا در سراسر جهان استفاده میشود.
نکات اصلی
VoiceOver — صفحهخوانی (screen reader) است که در سیستمعاملهای اپل تعبیه شده است. این ابزار برای کاربران نابینا و کمبینا طراحی شده و تعامل کامل با دستگاه را بدون تماس بصری فراهم میکند. VoiceOver تمام عناصر رابط را صداگذاری میکند: دکمهها، پیوندها، متن، تصاویر، اعلانها و عناصر سیستمی.
این فناوری اولین بار در سال ۲۰۰۵ برای macOS معرفی شد و در iOS با iPhone 3GS در سال ۲۰۰۹ ظاهر شد. از آن زمان، VoiceOver به بخش جداییناپذیر اکوسیستم اپل و یکی از استدلالهای اصلی برای دسترسپذیری پلتفرم تبدیل شده است. VoiceOver در سطح سیستم تعبیه شده است — یعنی بدون نیاز به یکپارچهسازی اضافی از سوی توسعهدهنده در هر برنامهای کار میکند، هرچند کیفیت صداگذاری مستقیماً به میزان استفاده برنامه از API دسترسپذیری iOS بستگی دارد.
VoiceOver از بیش از ۴۰ زبان با ترکیب گفتار طبیعی پشتیبانی میکند و با تنظیمات منطقهای صدا سازگار میشود. در iOS، VoiceOver از موتورهای صوتی Siri برای فارسی و سایر زبانها استفاده میکند که حداکثر طبیعیبودن صدا و لحن صحیح را با توجه به علائم نگارشی و زمینه تضمین میکند.
VoiceOver رویدادهای لمس را رهگیری میکند و آنها را متفاوت از ورودی استاندارد iOS تفسیر میکند. وقتی کاربر صفحه را لمس میکند، VoiceOver عنصر زیر انگشت را فعال نمیکند، بلکه ابتدا آن را اعلام میکند. فقط پس از دوبار لمس، عنصر فعال میشود. این تفاوت کلیدی است که به کاربران نابینا اجازه میدهد بدون خطر کلیک تصادفی، رابط را کاوش کنند.
VoiceOver عناصر رابط را به ترتیب منطقی میخواند: از چپ به راست، از بالا به پایین. ترتیب خواندن از سلسلهمراتب نمایش iOS به ارث میرسد، اما توسعهدهنده میتواند آن را از طریق ویژگی accessibilityElements برای چیدمانهای پیچیده تغییر دهد. کاربر میتواند بین عناصر با کشیدن به راست (بعدی) و چپ (قبلی) حرکت کند و همچنین با لمس عنصر خاص آن را اعلام کند.
در هر حرکت، VoiceOver نوع عنصر (دکمه، پیوند، سرتیتر)، نام آن (accessibilityLabel)، وضعیت (انتخابشده، غیرفعال) و راهنما (accessibilityHint) را بیان میکند. اگر عنصر حاوی مقدار باشد — مثلاً لغزنده صدا — VoiceOver آن را نیز اعلام میکند. ویژگیهای دسترسپذیری (UIAccessibilityTraits) علاوه بر این به کاربر درباره رفتار عنصر اطلاع میدهند: آیا دکمه، کلید تغییر وضعیت، جستجو یا کلید صفحهکلید است.
چرخدنده — یک دسته تنظیم مجازی است که حالت پیمایش VoiceOver را تغییر میدهد. کاربر چرخدنده را با دو انگشت (مانند دکمه صدا) میچرخاند و حالت را انتخاب میکند: کلمات، نویسهها، سرتیترها، پیوندها، نقاط ورود، ردیفهای جدول و غیره. حالت سرتیترها امکان جابجایی سریع بین H1-H6 در صفحات وب و برنامهها را فراهم میکند، و حالت نویسهها — تلفظ متن حرفبهحرف که برای پر کردن فرمها یا وارد کردن کدهای تأیید مفید است.
توسعهدهنده میتواند از طریق API UIAccessibilityCustomRotor حالتهای سفارشی به چرخدنده اضافه کند. مثلاً در برنامه یادداشتها میتوان چرخدنده «یادداشتهای موردعلاقه» یا «تغییرات اخیر» را اضافه کرد. چرخدندههای سفارشی پیمایش را در برنامههای خاص به طور قابل توجهی سرعت میبخشند و بهترین روش دسترسپذیری در iOS محسوب میشوند.
VoiceOver از مجموعه حرکات خاص خود استفاده میکند که با حرکات استاندارد iOS مطابقت ندارد. بیشتر حرکات به جای یک انگشت با سه انگشت انجام میشود — این کار از تداخل با کنترل عادی جلوگیری میکند و به VoiceOver امکان میدهد همزمان با ورودی استاندارد کار کند.
| عمل | حرکت | نتیجه |
|---|---|---|
| اعلام عنصر | لمس با ۱ انگشت | نام عنصر را میگوید |
| فعالسازی | دوبار لمس | فشار دکمه یا پیوند |
| عنصر بعدی | کشیدن به راست | رفتن به بعدی |
| عنصر قبلی | کشیدن به چپ | بازگشت به قبلی |
| پیمایش | کشیدن ۳ انگشت | پیمایش لیست یا صفحه |
| چرخدنده | چرخاندن ۲ انگشت | تغییر حالت پیمایش |
حرکت دوبار لمس روش اصلی فعالسازی عناصر در VoiceOver است. اگر عنصر نیاز به عمل خاصی دارد (مثلاً کشیدن)، VoiceOver از توالی «لمس — دوبار لمس و نگهداشتن» برای ورود به حالت جابجایی استفاده میکند. این امکان اجرای حرکات پیچیده مانند drag-and-drop را بدون دیدن صفحه فراهم میکند. VoiceOver همچنین از حرکت «دوبار لمس با دو انگشت» برای لغو عمل و «سهبار لمس» برای روشن/خاموش کردن پرده صفحه (Screen Curtain) پشتیبانی میکند.
توسعهدهنده برنامه iOS میتواند تعامل با VoiceOver را از طریق API UIAccessibility به طور قابل توجهی بهبود بخشد. تنظیمات پایه دسترسپذیری در Interface Builder (Identity Inspector → Accessibility) اضافه میشود، اما برای رابطهای پیچیده، تنظیمات برنامهنویسی در کد مورد نیاز است.
ویژگی accessibilityLabel متنی را تعیین میکند که VoiceOver برای عنصر اعلام میکند. اگر برچسب تنظیم نشده باشد، VoiceOver از متن دکمه یا placeholder فیلد متنی استفاده میکند. برای عناصر بدون متن (آیکونها، نمایشهای سفارشی)، برچسب الزامی است. ویژگی accessibilityTraits نوع عنصر را تعیین میکند: دکمه، سرتیتر، کلید تغییر وضعیت، جستجو، کلید صفحهکلید، مقدار متغیر، پیوند و غیره.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "پروفایل کاربری"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "صفحه تنظیمات پروفایل را باز میکند"
پرچم isAccessibilityElement پشتیبانی VoiceOver را برای نمایشهای سفارشی فعال میکند — به طور پیشفرض فقط برای عناصر استاندارد (UIButton، UILabel، UITextField) true است. پارامتر accessibilityHint راهنما اضافه میکند: VoiceOver آن را پس از مکث، اگر کاربر روی عنصر مکث کند، اعلام میکند. Hint باید نتیجه عمل را توصیف کند، نه دستورالعمل: «صفحه تنظیمات را باز میکند» به جای «برای باز کردن فشار دهید».
برای صفحههای پیچیده، جایی که گروه منطقی عناصر با ترتیب بصری مطابقت ندارد، از accessibilityElements استفاده میشود — آرایهای که ترتیب خواندن را تعیین میکند. مثلاً کارت محصول شامل تصویر، نام، قیمت و دکمه «افزودن به سبد خرید» است. اگر این عناصر به طور نامنظم در سلسلهمراتب نمایش چیده شده باشند، accessibilityElements ترتیب صحیح را برای VoiceOver تعیین میکند.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
برای ترکیب چند عنصر در یک عنصر قابل دسترس از UIAccessibilityContainer یا accessibilityFrame برای بازنویسی ناحیه لمس استفاده میشود. این زمانی مفید است که سلول جدول شامل چندین کامپوننت UI است، اما منطقاً یک عنصر را نشان میدهد — VoiceOver باید کل سلول را یکجا اعلام کند، نه اینکه محتوای آن را جداگانه مرور کند.
تنظیم صحیح دسترسپذیری برای VoiceOver نیاز به توجه به چند جنبه دارد: نشانهگذاری معنایی، بهروزرسانیهای پویا، پردازش عناصر سفارشی و آزمایش با screen reader واقعی.
در SwiftUI، دسترسپذیری از طریق تغییردهندههای .accessibilityLabel()، .accessibilityValue()، .accessibilityHint() و .accessibilityAddTraits() تنظیم میشود. SwiftUI به طور خودکار دسترسپذیری را از عناصر استاندارد به ارث میبرد، اما برای کامپوننتهای سفارشی، تنظیم صریح مورد نیاز است. مثلاً یک لغزنده سفارشی باید مقدار و فرمت تغییر خود را به VoiceOver اطلاع دهد.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("صدای صدا")
.accessibilityValue(
Text("\(Int(volume)) درصد")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
تغییردهنده accessibilityAdjustableAction امکان تغییر مقدار را با حرکات VoiceOver اضافه میکند: کشیدن به بالا — افزایش، کشیدن به پایین — کاهش. بدون این تغییردهنده، لغزنده برای کنترل از طریق screen reader غیرقابل دسترس باقی میماند. تنظیم مشابهی برای استپرها، پیکرها و سایر عناصر تغییردهنده مقدار مورد نیاز است.
وقتی محتوای صفحه به صورت پویا تغییر میکند (اعلانی ظاهر شد، وضعیت بارگذاری بهروز شد، قیمت تغییر کرد)، VoiceOver باید از طریق UIAccessibility.post اعلان دریافت کند. بدون این فراخوانی، screen reader از تغییرات مطلع نمیشود و کاربر اطلاعات مهم را از دست میدهد. برای SwiftUI از تغییردهنده .accessibilityAnnouncement() استفاده میشود.
UIAccessibility.post(
notification: .announcement,
argument: "قیمت ۲۰ درصد کاهش یافته"
)
// SwiftUI
Text("قیمت بهروز شد")
.accessibilityAnnouncement(Text("تخفیف ۲۰%"))
اعلانهای VoiceOver باید به صورت منطقی استفاده شوند: اعلانهای بیش از حد کاربر را آزار میدهد و نبود آنها برنامه را غیرقابل دسترس میکند. استراتژی بهینه — فقط تغییراتی را اعلام کنید که بر جریان کاری فعلی کاربر تأثیر میگذارند: بهروزرسانی سبد خرید، وضعیت بارگذاری، خطای اعتبارسنجی فرم، اعلان چت. تغییرات پسزمینه (زمان روی نوار، نرخ ارز) نیازی به اعلام ندارند — کاربر در صورت لزوم خود بررسی میکند.
آزمایش VoiceOver از طریق دستگاه فیزیکی با screen reader فعال یا شبیهساز iOS با گزینه Accessibility Inspector انجام میشود. بررسی سناریوهای استفاده کامل مهم است: بدون کنترل بصری ثبتنام کنید، سفارش دهید، محصول را با جستجو پیدا کنید. اگر مسیر بدون بازخورد بصری قابل عبور است — VoiceOver به درستی تنظیم شده است.
سوالات متداول
تنظیمات → دسترسپذیری → VoiceOver. کلید را فعال کنید. برای فعالسازی سریع از سهبار فشار دادن دکمه کناری (در iPhone X و جدیدتر) یا دکمه Home استفاده میشود. Siri نیز میتواند VoiceOver را با دستور «VoiceOver را فعال کن» روشن کند.
VoiceOver — صفحهخوان اپل برای iOS، TalkBack — صفحهخوان گوگل برای اندروید. اصل کار یکسان است: لمس اعلام میکند، دوبار لمس فعال میکند. تفاوت در حرکات، تنظیمات چرخدنده و یکپارچهسازیهای اکوسیستمی است: VoiceOver عمیقتر با iCloud و Apple Pay یکپارچه شده است.
از API UIAccessibility استفاده کنید: برای همه عناصر accessibilityLabel، برای نوع عنصر accessibilityTraits و برای راهنماها accessibilityHint تنظیم کنید. در SwiftUI از تغییردهندههای .accessibilityLabel() و .accessibilityAddTraits() استفاده کنید. برنامه را با VoiceOver فعال آزمایش کنید.
چرخدنده — حالت پیمایشی است که با چرخاندن دو انگشت تغییر میکند. تعیین میکند که چگونه بین عناصر حرکت کنید: بر اساس سرتیترها، نویسهها، کلمات، پیوندها یا نقاط ورود. توسعهدهندگان میتوانند حالتهای خود را از طریق UIAccessibilityCustomRotor اضافه کنند.
برای UIViewهای سفارشی باید isAccessibilityElement = true تنظیم کرده و accessibilityLabel تعیین کنید. اگر عنصر از چند نمای فرزند تشکیل شده است، از accessibilityElements برای تعیین ترتیب خواندن استفاده کنید یا آنها را در یک کانتینر ترکیب کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید