VoiceOver, Apple'ın her arayüz öğesini seslendiren ve jestlerle cihazı kontrol etmeyi sağlayan yerleşik ekran okuyucusudur. Teknoloji, sistem düzeyinde iOS, iPadOS ve macOS'a entegre edilmiştir ve ek yazılım kurulumu gerektirmez. Apple Accessibility (2025)'e göre VoiceOver 40'tan fazla dili destekler ve dünya çapında milyonlarca görme engelli ve az gören kullanıcı tarafından kullanılır.
Önemli Noktalar
VoiceOver, Apple işletim sistemlerine entegre edilmiş bir ekran okuyucusudur. Görme engelli ve az gören kullanıcılar için tasarlanmıştır ve görsel temas olmadan cihazla tam etkileşim sağlar. VoiceOver arayüzün tüm öğelerini seslendirir: düğmeler, bağlantılar, metin, resimler, bildirimler ve sistem öğeleri.
Teknoloji ilk olarak 2005 yılında macOS için tanıtıldı ve iOS'ta 2009 yılında iPhone 3GS ile birlikte geldi. O zamandan beri VoiceOver, Apple ekosisteminin ayrılmaz bir parçası ve platformun erişilebilirliği lehindeki ana argümanlardan biri haline geldi. VoiceOver sistem düzeyinde yerleşiktir — yani geliştiriciden ek entegrasyon olmadan herhangi bir uygulamada çalışır, ancak seslendirme kalitesi doğrudan uygulamanın iOS Erişilebilirlik API'sini ne kadar iyi kullandığına bağlıdır.
VoiceOver, doğal konuşma sentezi ile 40'tan fazla dili destekler ve bölgesel ses ayarlarına uyum sağlar. iOS'ta VoiceOver, Türkçe ve diğer birçok dil için Siri ses motorlarını kullanarak noktalama işaretleri ve bağlama bağlı olarak en doğal sesi ve doğru tonlamayı sağlar.
VoiceOver dokunma olaylarını yakalar ve bunları standart iOS girişinden farklı şekilde yorumlar. Bir kullanıcı ekrana dokunduğunda, VoiceOver parmağın altındaki öğeyi etkinleştirmez, önce onu seslendirir. Yalnızca çift dokunmadan sonra öğe etkinleşir. Bu temel fark, görme engelli kullanıcıların yanlışlıkla tıklama riski olmadan arayüzü keşfetmesine olanak tanır.
VoiceOver arayüz öğelerini mantıksal sırayla okur: soldan sağa, yukarıdan aşağıya. Okuma sırası iOS görünüm hiyerarşisinden devralınır, ancak geliştirici karmaşık düzenler için accessibilityElements özelliği aracılığıyla değiştirebilir. Kullanıcı, sağa kaydırarak (sonraki) ve sola kaydırarak (önceki) öğeler arasında hareket edebilir ve ayrıca belirli bir öğeye dokunarak seslendirilmesini sağlayabilir.
Her harekette VoiceOver, öğe türünü (düğme, bağlantı, başlık), adını (accessibilityLabel), durumunu (seçili, devre dışı) ve ipucunu (accessibilityHint) söyler. Öğe bir değer içeriyorsa — örneğin, bir ses seviyesi kaydırıcısı — VoiceOver onu da seslendirir. Erişilebilirlik Özellikleri (UIAccessibilityTraits), kullanıcıya öğenin davranışı hakkında ek bilgi verir: bir düğme, anahtar, arama alanı veya klavye tuşu olup olmadığı.
Rotor, VoiceOver gezinme modunu değiştiren sanal bir ayar kadranıdır. Kullanıcı rotoru iki parmağıyla döndürür (bir ses düğmesi gibi) ve bir mod seçer: kelimeler, karakterler, başlıklar, bağlantılar, giriş noktaları, tablo satırları ve diğerleri. Başlık modu, web sayfalarında ve uygulamalarda H1-H6 arasında hızlı geçiş yapmayı sağlarken, karakter modu metni harf harf söyler, bu da form doldurma veya doğrulama kodu girerken kullanışlıdır.
Geliştirici, UIAccessibilityCustomRotor API'si aracılığıyla rotora özel modlar ekleyebilir. Örneğin, bir not uygulamasında “Favori Notlar” veya “Son Değişiklikler” rotoru eklenebilir. Özel rotorlar belirli uygulamalarda gezinmeyi önemli ölçüde hızlandırır ve iOS erişilebilirliğinde en iyi uygulama olarak kabul edilir.
VoiceOver, standart iOS jestleriyle eşleşmeyen kendi jest setini kullanır. Çoğu jest, bir parmak yerine üç parmakla gerçekleştirilir — bu, normal çalışmayla çakışmaları önler ve VoiceOver'ın standart girişle aynı anda çalışmasını sağlar.
| Eylem | Jest | Sonuç |
|---|---|---|
| Öğeyi seslendir | 1 parmakla dokunma | Öğe adını söyler |
| Etkinleştir | Çift dokunma | Düğmeye veya bağlantıya basar |
| Sonraki öğe | Sağa kaydırma | Sonraki öğeye geç |
| Önceki öğe | Sola kaydırma | Önceki öğeye dön |
| Kaydırma | 3 parmakla kaydırma | Listeyi veya sayfayı kaydır |
| Rotor | 2 parmakla döndürme | Gezinme modunu değiştir |
Çift dokunma jesti, VoiceOver'da öğeleri etkinleştirmenin ana yoludur. Bir öğe özel bir eylem gerektiriyorsa (örneğin, sürükleme), VoiceOver hareket moduna girmek için “dokunma — çift dokunma ve basılı tutma” sırasını kullanır. Bu, ekranı görmeden sürükle-bırak gibi karmaşık jestlerin gerçekleştirilmesini sağlar. VoiceOver ayrıca bir eylemi iptal etmek için “iki parmakla çift dokunma” ve Ekran Perdesini (Screen Curtain) açıp kapatmak için “üçlü dokunma” jestini de destekler.
iOS uygulama geliştiricisi, UIAccessibility API'si aracılığıyla VoiceOver etkileşimini önemli ölçüde iyileştirebilir. Temel erişilebilirlik ayarları Interface Builder'da (Identity Inspector → Accessibility) eklenir, ancak karmaşık arayüzler kodda programatik yapılandırma gerektirir.
accessibilityLabel özelliği, VoiceOver'ın öğe için söylediği metni ayarlar. Etiket ayarlanmazsa, VoiceOver düğme metnini veya metin alanı yer tutucusunu kullanır. Metni olmayan öğeler (simgeler, özel görünümler) için etiket zorunludur. accessibilityTraits özelliği öğe türünü tanımlar: düğme, başlık, anahtar, arama alanı, klavye tuşu, değer değiştirir, bağlantı ve diğerleri.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Kullanıcı profili"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Profil ayarları ekranını açar"
isAccessibilityElement bayrağı, özel görünümler için VoiceOver desteğini etkinleştirir — varsayılan olarak yalnızca standart öğeler (UIButton, UILabel, UITextField) için doğrudur. accessibilityHint parametresi bir ipucu ekler: kullanıcı bir öğede durursa, VoiceOver bir duraklamadan sonra ipucunu söyler. İpucu, eylemin sonucunu tanımlamalıdır, talimatı değil: “Ayarlar ekranını açar”, “açmak için basın” yerine.
Öğelerin mantıksal grubunun görsel sırayla eşleşmediği karmaşık ekranlar için accessibilityElements kullanılır — okuma sırasını ayarlayan bir dizi. Örneğin, bir ürün kartı bir resim, ad, fiyat ve “Sepete Ekle” düğmesi içerir. Bu öğeler görünüm hiyerarşisinde düzensiz bir şekilde düzenlenmişse, accessibilityElements VoiceOver için doğru sırayı belirler.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Birden çok öğeyi tek bir erişilebilir öğede birleştirmek için, dokunma alanını geçersiz kılmak üzere UIAccessibilityContainer veya accessibilityFrame kullanılır. Bu, bir tablo hücresi birden çok UI bileşeni içerdiğinde ancak mantıksal olarak tek bir öğeyi temsil ettiğinde kullanışlıdır — VoiceOver tüm hücreyi bir bütün olarak seslendirmeli, içeriğini tek tek dolaşmamalıdır.
VoiceOver için doğru erişilebilirlik yapılandırması, birkaç hususa dikkat gerektirir: anlamsal işaretleme, dinamik güncellemeler, özel öğe yönetimi ve gerçek bir ekran okuyucuyla test etme.
SwiftUI'da erişilebilirlik, .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() ve .accessibilityAddTraits() değiştiricileri aracılığıyla yapılandırılır. SwiftUI, standart öğelerden erişilebilirliği otomatik olarak devralır, ancak özel bileşenler açık yapılandırma gerektirir. Örneğin, özel bir kaydırıcı VoiceOver'a değerini ve değişim biçimini bildirmelidir.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Ses seviyesi")
.accessibilityValue(
Text("\(Int(volume)) yüzde")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
accessibilityAdjustableAction değiştiricisi, VoiceOver jestleriyle değerleri değiştirme yeteneği ekler: yukarı kaydırma — artırma, aşağı kaydırma — azaltma. Bu değiştirici olmadan, kaydırıcı ekran okuyucu kontrolü için erişilemez kalır. Özel stepleyiciler, seçiciler ve değerini değiştiren diğer öğeler için benzer yapılandırma gerekir.
Ekrandaki içerik dinamik olarak değiştiğinde (bir bildirim görünür, yükleme durumu güncellenir, bir fiyat değişir), VoiceOver'ın UIAccessibility.post aracılığıyla bir bildirim alması gerekir. Bu çağrı olmadan, ekran okuyucu değişiklikleri bilemez ve kullanıcı önemli bilgileri kaçırır. SwiftUI için .accessibilityAnnouncement() değiştiricisi kullanılır.
UIAccessibility.post(
notification: .announcement,
argument: "Fiyat yüzde 20 düşürüldü"
)
// SwiftUI
Text("Fiyat güncellendi")
.accessibilityAnnouncement(Text("%20 indirim"))
VoiceOver bildirimleri akıllıca kullanılmalıdır: aşırı duyurular kullanıcıyı rahatsız ederken, yoklukları uygulamayı erişilemez hale getirir. En uygun strateji, yalnızca kullanıcının mevcut iş akışını etkileyen değişiklikleri duyurmaktır: sepet güncellemeleri, yükleme durumu, form doğrulama hatası, sohbet bildirimi. Arka plan değişiklikleri (paneldeki saat, döviz kurları) duyuru gerektirmez — kullanıcı gerektiğinde bunları kendisi kontrol eder.
VoiceOver testi, ekran okuyucu etkinleştirilmiş fiziksel bir cihaz veya Accessibility Inspector seçeneği olan bir iOS simülatörü kullanılarak gerçekleştirilir. Tam kullanım senaryolarını test etmek önemlidir: görsel kontrol olmadan kaydolma, sipariş verme, arama yoluyla ürün bulma. Akış görsel geri bildirim olmadan gezilebilir ise — VoiceOver doğru yapılandırılmıştır.
Sıkça Sorulan Sorular
Ayarlar → Erişilebilirlik → VoiceOver. Anahtarı açın. Hızlı etkinleştirme için yan düğmeye (iPhone X ve sonrası) veya Ana Ekran düğmesine üç kez tıklayın. Siri de “VoiceOver'ı aç” komutuyla VoiceOver'ı etkinleştirebilir.
VoiceOver, iOS için Apple'ın ekran okuyucusu, TalkBack ise Android için Google'ın ekran okuyucusudur. Çalışma prensibi aynıdır: dokunma seslendirir, çift dokunma etkinleştirir. Fark jestlerde, rotor ayarlarında ve ekosistem entegrasyonlarındadır: VoiceOver iCloud ve Apple Pay ile daha derin entegredir.
UIAccessibility API'sini kullanın: tüm öğeler için accessibilityLabel, öğe türü için accessibilityTraits ve ipuçları için accessibilityHint ayarlayın. SwiftUI'da .accessibilityLabel() ve .accessibilityAddTraits() değiştiricilerini kullanın. VoiceOver etkinken uygulamayı test edin.
Rotor, iki parmak döndürülerek değiştirilen bir gezinme modudur. Öğeler arasında nasıl hareket edileceğini belirler: başlıklara, karakterlere, kelimelere, bağlantılara veya giriş noktalarına göre. Geliştiriciler UIAccessibilityCustomRotor aracılığıyla kendi modlarını ekleyebilir.
Özel UIView için isAccessibilityElement = true ayarlamanız ve accessibilityLabel sağlamanız gerekir. Öğe birden çok alt görünümden oluşuyorsa, okuma sırasını ayarlamak için accessibilityElements kullanın veya bunları bir kapsayıcıda birleştirin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun