Takip et

SwiftUI Erişilebilirlik İç Yapıları: Herkes İçin Uygulamalar Geliştirmek

SwiftUI Erişilebilirlik İç Yapıları: Herkes İçin Uygulamalar Geliştirmek SwiftUI, modern ve deklaratif bir UI framework’ü olarak uygulama geliştir…

SwiftUI Erişilebilirlik İç Yapıları: Herkes İçin Uygulamalar Geliştirmek

SwiftUI, modern ve deklaratif bir UI framework’ü olarak uygulama geliştirme süreçlerini basitleştirirken, erişilebilirlik konusunu da merkeze alır. Uygulamalarımızın herkes tarafından kullanılabilir olması, sadece etik bir sorumluluk değil, aynı zamanda geniş bir kullanıcı kitlesine ulaşmanın da anahtarıdır. Bu makalede, SwiftUI’ın erişilebilirlik iç yapılarını, temel prensiplerini ve bu güçlü araçları kullanarak nasıl daha kapsayıcı uygulamalar geliştirebileceğimizi detaylı bir şekilde inceleyeceğiz. Erişilebilirlik modifiyerlerinden, VoiceOver entegrasyonuna, erişilebilirlik ağacının derinliklerinden özel eleman oluşturmaya kadar birçok konuya değineceğiz.

1. Erişilebilirliğin Temelleri ve SwiftUI’daki Yeri

Erişilebilirlik, bir ürünün, hizmetin veya ortamın engelli bireyler tarafından kolayca kullanılabilmesini ifade eder. Mobil uygulamalar özelinde, görme, işitme, motor veya bilişsel engelleri olan kullanıcıların uygulamayı sorunsuz bir şekilde deneyimleyebilmesi anlamına gelir. SwiftUI, bu konuda geliştiricilere önemli kolaylıklar sunar.

1.1. Neden Erişilebilirlik Önemlidir?

Erişilebilirlik, sadece yasal gereklilikleri yerine getirmekten öte, etik bir sorumluluktur. Dünya genelinde milyonlarca engelli birey bulunmaktadır ve bu kişilerin dijital dünyaya eşit erişime sahip olması temel bir haktır. Erişilebilir uygulamalar, daha geniş bir kullanıcı tabanına ulaşmanızı, marka itibarınızı güçlendirmenizi ve sosyal sorumluluk bilinciyle hareket etmenizi sağlar. Ayrıca, erişilebilirlik uygulamaları genellikle daha iyi bir kullanıcı deneyimi sunar ve herkes için daha kolay kullanılabilir hale gelir.

1.2. Engelli Kullanıcı Grupları

Erişilebilirlik denince akla genellikle görme engelliler gelse de, farklı engelli grupları için de optimizasyon yapmak gereklidir:

  • Görme Engelliler: VoiceOver gibi ekran okuyucular, büyük metinler, yüksek kontrast.
  • İşitme Engelliler: Altyazılar, metin transkriptleri, görsel bildirimler.
  • Motor Engelliler: Büyük dokunma hedefleri, tek elle kullanım kolaylığı, klavye navigasyonu.
  • Bilişsel Engelliler: Basit arayüzler, anlaşılır dil, tekrarlayan desenler.

1.3. SwiftUI’ın Erişilebilirlik Felsefesi

SwiftUI, varsayılan olarak birçok erişilebilirlik özelliğini bünyesinde barındırır. Örneğin, standart kontroller (Button, Text, Toggle vb.) otomatik olarak VoiceOver tarafından okunabilir ve etkileşimli hale gelir. SwiftUI’ın deklaratif yapısı, erişilebilirlik modifiyerlerinin kolayca uygulanmasına olanak tanır, böylece geliştiriciler UI’larını oluştururken aynı zamanda erişilebilirliği de düşünebilirler. Bu entegrasyon, erişilebilirliği geliştirme sürecinin sonuna bırakmak yerine, baştan itibaren bir parçası haline getirir.

2. SwiftUI Erişilebilirlik API’ları ve Modifier’lar

SwiftUI, erişilebilirliği özelleştirmek ve iyileştirmek için zengin bir modifiyer seti sunar. Bu modifiyerler, VoiceOver gibi yardımcı teknolojilerin bir UI öğesini nasıl yorumlayacağını belirlemenizi sağlar.

2.1. accessibilityLabel ve accessibilityValue

  • accessibilityLabel(_:): Bir öğeyi tanımlayan kısa, açıklayıcı bir metin sağlar. VoiceOver, kullanıcı bir öğeye odaklandığında bu etiketi okur. Görsel olarak açık olmayan veya sadece bir simgeyle temsil edilen öğeler için hayati öneme sahiptir.
    
    Image(systemName: "heart.fill")
        .accessibilityLabel("Favorilere Ekle")
    

  • accessibilityValue(_:): Bir öğenin mevcut durumunu veya değerini açıklar. Özellikle kaydırıcılar, ilerleme göstergeleri veya anahtarlar gibi dinamik değerlere sahip öğeler için kullanılır.
    
    Slider(value: $volume, in: 0...100)
        .accessibilityLabel("Ses Seviyesi")
        .accessibilityValue("\(Int(volume)) yüzde")
    

2.2. accessibilityHint ve accessibilityAddTraits

  • accessibilityHint(_:): Bir öğenin ne yapacağını veya nasıl kullanılacağını açıklayan kısa bir ipucu sağlar. Genellikle bir öğeye odaklanıldıktan sonra, etiketten sonra okunur.
    
    Button("Gönder") { /* action */ }
        .accessibilityLabel("Gönder butonu")
        .accessibilityHint("Formdaki bilgileri sunucuya gönderir.")
    

  • accessibilityAddTraits(_:): Bir öğenin davranışını veya durumunu açıklayan bir veya daha fazla erişilebilirlik özelliği ekler. Örneğin, bir düğmenin "button" özelliği, bir metnin "staticText" özelliği gibi.
    
    Text("Yeni Mesaj")
        .accessibilityAddTraits(.isHeader) // Başlık olarak işaretler
    


    Yaygın özellikler: .isButton, .isSelected, .isAdjustable, .isHeader, .isImage, .playsSound.

2.3. accessibilityRemoveTraits ve accessibilityHidden

  • accessibilityRemoveTraits(_:): Bir öğeden varsayılan olarak atanmış bir erişilebilirlik özelliğini kaldırır. Nadiren kullanılır, ancak bir öğenin varsayılan davranışını değiştirmek istediğinizde faydalı olabilir.
  • accessibilityHidden(_:): Bir öğeyi ve tüm alt öğelerini erişilebilirlik ağacından tamamen gizler. Bu, VoiceOver'ın bu öğeyi görmesini ve okumasını engeller. Sadece dekoratif veya tekrarlayan bilgiler için kullanılmalıdır.
    
    Image(systemName: "arrow.right")
        .accessibilityHidden(true) // Sadece görsel bir ok, açıklanmasına gerek yok
    

3. Erişilebilirlik Ağacı

Erişilebilirlik ağacı, VoiceOver ve diğer yardımcı teknolojilerin bir uygulamanın kullanıcı arayüzünü anlamak için kullandığı hiyerarşik bir yapıdır. Her bir erişilebilir öğe, bu ağaçta bir düğüm olarak temsil edilir ve label, value, hint, traits gibi özelliklere sahiptir.

3.1. VoiceOver ve Erişilebilirlik Ağacı İlişkisi

VoiceOver, kullanıcının parmağını ekranda gezdirdiğinde veya öğeler arasında gezinmek için kaydırma hareketleri yaptığında, erişilebilirlik ağacındaki öğeleri okur. Ağacın doğru bir şekilde yapılandırılması, VoiceOver kullanıcılarının uygulamanızda etkili bir şekilde gezinmesini sağlar. Bir öğenin ağaçta nasıl görüneceği, uyguladığınız modifiyerlere bağlıdır.

3.2. Otomatik Gruplama ve Manuel Gruplama

SwiftUI, genellikle ilgili öğeleri otomatik olarak gruplandırarak VoiceOver'ın daha anlamlı bir şekilde okumasını sağlar. Örneğin, bir VStack içindeki bir simge ve metin, genellikle tek bir erişilebilir öğe olarak okunur. Ancak bazen bu otomatik gruplama yeterli olmayabilir veya istediğiniz gibi çalışmayabilir.

  • Otomatik Gruplama:
    
    HStack {
        Image(systemName: "bell.fill")
        Text("Bildirimler")
    } // VoiceOver muhtemelen "Bildirimler" olarak okur.
    

  • Manuel Gruplama (.accessibilityElement(children: .combine)): Birden fazla öğeyi tek bir erişilebilir öğe olarak birleştirmek istediğinizde bu modifiyeri kullanabilirsiniz. Bu, VoiceOver'ın daha az gezinme adımıyla daha fazla bilgi edinmesini sağlar.
    
    HStack {
        Image(systemName: "bell.fill")
        Text("Bildirimler")
    }
    .accessibilityElement(children: .combine)
    .accessibilityLabel("Bildirimler")
    .accessibilityHint("Yeni bildirimleri gösterir.")
    

  • Ayrı Öğeler (.accessibilityElement(children: .ignore)): Bazen bir grubun içindeki her öğenin ayrı ayrı erişilebilir olması gerekebilir. Bu durumda, .accessibilityElement(children: .ignore) kullanarak otomatik gruplamayı devre dışı bırakabilirsiniz. Bu, özellikle karmaşık ve etkileşimli bileşenlerin birleşiminde faydalıdır.

3.3. Erişilebilirlik Öğelerinin Sırası

VoiceOver, genellikle öğeleri ekrandaki görsel düzenlerine göre soldan sağa, yukarıdan aşağıya doğru okur. Ancak, özel düzenler veya karmaşık hiyerarşilerde bu sıra bozulabilir. accessibilitySortPriority(_:) modifiyeri ile öğelerin okunma sırasını manuel olarak ayarlayabilirsiniz. Daha yüksek öncelik değeri, öğenin daha erken okunacağı anlamına gelir.


HStack {
    Text("Önce okunacak")
        .accessibilitySortPriority(1)
    Text("Sonra okunacak")
        .accessibilitySortPriority(0)
}

4. Özel Erişilebilirlik Öğeleri Oluşturma

Bazen standart SwiftUI görünümleri ve modifiyerleri, karmaşık veya özel tasarlanmış UI bileşenleri için yeterli olmayabilir. Bu durumlarda, accessibilityRepresentation gibi araçlarla kendi erişilebilirlik öğelerinizi oluşturabilirsiniz.

4.1. accessibilityRepresentation Kullanımı

accessibilityRepresentation modifiyeri, bir görünümün erişilebilirlik ağacındaki temsilini tamamen değiştirmenize olanak tanır. Bu, özellikle bir görünümün görsel olarak karmaşık olduğu ancak erişilebilirlik açısından daha basit bir şekilde temsil edilmesi gerektiği durumlarda kullanışlıdır.


struct CustomProgressView: View {
    var progress: Double
    var body: some View {
        ZStack(alignment: .leading) {
            Capsule()
                .fill(Color.gray.opacity(0.3))
                .frame(height: 20)
            Capsule()
                .fill(Color.blue)
                .frame(width: CGFloat(progress) * 200, height: 20)
        }
        .accessibilityRepresentation {
            Slider(value: .constant(progress), in: 0...1)
                .accessibilityLabel("İlerleme")
                .accessibilityValue("\(Int(progress * 100))%")
        }
    }
}


Bu örnekte, özel bir ilerleme çubuğu görsel olarak karmaşık olsa da, erişilebilirlik ağacında basit bir kaydırıcı (Slider) olarak temsil edilerek VoiceOver'ın daha kolay anlaması sağlanmıştır.

4.2. Karmaşık Görünümler İçin Çözümler

Karmaşık görünümlerde, örneğin bir takvim görünümü veya özel bir grafik bileşeni, her bir etkileşimli parçayı ayrı ayrı erişilebilir hale getirmek önemlidir. Her bir gün hücresini veya grafik noktasını kendi accessibilityLabel, accessibilityValue ve accessibilityAddTraits ile donatmak gerekebilir. Ayrıca, bu tür durumlarda accessibilityElement(children: .ignore) kullanarak varsayılan gruplamayı devre dışı bırakıp her bir parçayı manuel olarak yönetmek daha doğru bir yaklaşım olabilir.

4.3. Erişilebilirlik Odak Yönetimi

VoiceOver kullanıcıları, genellikle ekranda gezinmek için kaydırma hareketleri kullanır. Ancak, belirli durumlarda, uygulamanın programatik olarak odağı belirli bir öğeye taşıması gerekebilir. Örneğin, bir hata mesajı görüntülendiğinde odağı hata mesajına taşımak, kullanıcının hatayı hemen fark etmesini sağlar. SwiftUI 5 ve üzeri sürümlerde AccessibilityFocusState ve focused(_:) modifiyerleri ile odak yönetimi daha kolay hale gelmiştir.


enum FocusableField: Hashable {
    case username, password
}

struct LoginView: View {
    @State private var username = ""
    @State private var password = ""
    @AccessibilityFocusState private var focusedField: FocusableField?

    var body: some View {
        VStack {
            TextField("Kullanıcı Adı", text: $username)
                .focused($focusedField, equals: .username)
            SecureField("Şifre", text: $password)
                .focused($focusedField, equals: .password)
            Button("Giriş Yap") {
                // Giriş mantığı
                // Eğer hata olursa:
                // focusedField = .username // Hata durumunda ilgili alana odaklan
            }
        }
        .onAppear {
            focusedField = .username // Sayfa açıldığında kullanıcı adına odaklan
        }
    }
}

5. Erişilebilirlik Eylemleri

Erişilebilirlik eylemleri, VoiceOver kullanıcılarının bir öğe üzerinde gerçekleştirebileceği özel etkileşimleri tanımlamanıza olanak tanır. Bu, kullanıcılara daha zengin ve bağlamsal bir deneyim sunar.

5.1. accessibilityAction ile Özel Eylemler Tanımlama

accessibilityAction(_:handler:) modifiyeri, bir öğe için özel eylemler eklemenizi sağlar. VoiceOver kullanıcısı bir öğeye odaklandığında, parmağını yukarı veya aşağı kaydırarak bu eylemleri keşfedebilir ve çift dokunarak tetikleyebilir.


Text("E-postayı Sil")
    .accessibilityAction(.delete) {
        print("E-posta silindi!")
    }


Yaygın eylem türleri: .default, .delete, .magicTap, .escape, .activate.

5.2. Ayarlanabilir Değerler (.accessibilityAdjustableAction)

accessibilityAdjustableAction(from:to:by:onIncrement:onDecrement:) modifiyeri, bir öğenin değerini artırma veya azaltma eylemlerini tanımlamak için kullanılır. Bu, kaydırıcılar, adım sayıcılar veya ses kontrolleri gibi ayarlanabilir öğeler için idealdir.


@State private var counter = 0

Text("Sayaç: \(counter)")
    .accessibilityLabel("Sayaç")
    .accessibilityValue("\(counter)")
    .accessibilityAdjustableAction { direction in
        switch direction {
        case .increment:
            counter += 1
        case .decrement:
            counter -= 1
        @unknown default:
            break
        }
    }


VoiceOver kullanıcısı bu öğeye odaklandığında, yukarı ve aşağı kaydırma hareketleriyle sayacı artırıp azaltabilir.

5.3. Eylem Örnekleri ve Kullanım Senaryoları

Senaryo Erişilebilirlik Modifiyeri/Eylemi Açıklama
Bir listedeki öğeyi silme .accessibilityAction(.delete) { ... } Kullanıcıya "Sil" eylemini sunar.
Bir öğeyi favorilere ekleme/çıkarma .accessibilityAction(named: "Favorilere Ekle") { ... } Özel adlandırılmış bir eylem sunar.
Bir videoyu oynatma/durdurma .accessibilityAction(.magicTap) { ... } İki parmakla çift dokunma hareketine yanıt verir.
Bir kaydırıcının değerini değiştirme .accessibilityAdjustableAction { ... } Yukarı/aşağı kaydırma ile değeri ayarlar.

6. Test ve Hata Ayıklama

Erişilebilirliği sağlamak sadece kod yazmakla bitmez; uygulamanın gerçek kullanıcılar tarafından nasıl deneyimleneceğini test etmek de kritik öneme sahiptir.

6.1. VoiceOver ile Test Etme

En etkili test yöntemi, uygulamanızı VoiceOver açıkken kullanmaktır. Ayarlar > Erişilebilirlik > VoiceOver yolunu izleyerek veya üç kez Ana Ekran/Yan düğmeye basarak VoiceOver'ı açıp kapatabilirsiniz.
VoiceOver ile test ederken şunlara dikkat edin:

  • Her öğe doğru şekilde etiketlenmiş mi?
  • Etiketler ve ipuçları anlaşılır ve açıklayıcı mı?
  • Öğeler arasında gezinme sırası mantıklı mı?
  • Etkileşimli öğeler (düğmeler, anahtarlar vb.) doğru şekilde çalışıyor mu?
  • Özel eylemler doğru şekilde tetikleniyor mu?

6.2. Erişilebilirlik Denetçisi (Accessibility Inspector)

Xcode ile birlikte gelen Erişilebilirlik Denetçisi, uygulamanızın erişilebilirlik ağacını görselleştirmek ve hata ayıklamak için güçlü bir araçtır.

  • Açma: Xcode > Open Developer Tool > Accessibility Inspector.
  • Kullanım: Uygulamanızı çalıştırın, Denetçi'de hedef uygulamanızı seçin ve fare imlecini UI öğelerinin üzerine getirin. Denetçi, öğenin label, value, hint, traits gibi tüm erişilebilirlik özelliklerini gösterecektir.
  • Faydaları: Yanlış etiketleri, eksik ipuçlarını, hatalı gruplamaları ve erişilebilirlik ağacındaki diğer sorunları hızlıca tespit etmenizi sağlar.

6.3. Kod Tabanlı Test Yaklaşımları

Unit ve UI testleri, erişilebilirlik özelliklerinin doğru şekilde uygulandığından emin olmak için kullanılabilir. XCUITest framework'ü, erişilebilirlik öğelerini bulmak ve onlarla etkileşim kurmak için API'lar sunar.


func testAccessibilityLabelForButton() throws {
    let app = XCUIApplication()
    app.launch()

    let myButton = app.buttons["Gönder butonu"] // accessibilityLabel ile bul
    XCTAssertTrue(myButton.exists)
    XCTAssertEqual(myButton.label, "Gönder butonu")
}


Bu tür testler, regresyonları önlemeye ve uygulamanızın erişilebilirliğini sürekli olarak korumaya yardımcı olur.

7. En İyi Uygulamalar ve İpuçları

Erişilebilirliği uygulamanıza entegre ederken göz önünde bulundurmanız gereken bazı en iyi uygulamalar ve ipuçları:

7.1. Anlamlı Etiketler Kullanma

Erişilebilirlik etiketleri kısa, açıklayıcı ve bağlamı yansıtmalıdır. "Düğme" veya "Resim" gibi genel etiketlerden kaçının. Bunun yerine, "Ayarlar düğmesi" veya "Profil resmi" gibi daha spesifik ifadeler kullanın. Metin içeriklerini tekrar etmeyin, zaten görünür olan metinler genellikle VoiceOver tarafından otomatik olarak okunur.

7.2. Renk Kontrastı ve Boyutlandırma

  • Renk Kontrastı: Metin ve arka plan renkleri arasında yeterli kontrast olduğundan emin olun. WCAG (Web İçeriği Erişilebilirlik Yönergeleri) 2.1 standardı, AAA seviyesi için 7:1, AA seviyesi için ise 4.5:1 kontrast oranını önerir. Düşük kontrast, özellikle görme engelli veya renk körü kullanıcılar için metni okunaksız hale getirebilir.
  • Boyutlandırma: Dokunma hedefleri (düğmeler, anahtarlar vb.) en az 44x44 punto boyutunda olmalıdır. Bu, motor engelli veya büyük parmaklı kullanıcıların öğelere kolayca dokunabilmesini sağlar. Metin boyutları da okunabilirliği artırmak için yeterince büyük olmalıdır.

7.3. Dinamik Tip Desteği

Uygulamanızın, kullanıcının sistem genelindeki metin boyutu ayarlarına uyum sağladığından emin olun. SwiftUI, .font(.body) veya .font(.title) gibi metin stilleri kullandığınızda bunu otomatik olarak yapar. Ancak, özel fontlar veya sabit boyutlar kullanıyorsanız, scaledFont gibi özel modifiyerler veya UIFontMetrics kullanarak dinamik tip desteği sağlamanız gerekebilir. Bu, görme engelli kullanıcıların metinleri kendi tercihlerine göre büyütmesine olanak tanır.

Sonuç

SwiftUI, erişilebilirliği uygulama geliştirme sürecinin doğal bir parçası haline getirerek, geliştiricilere güçlü ve esnek araçlar sunar. Erişilebilirlik modifiyerlerini doğru bir şekilde kullanmak, erişilebilirlik ağacını anlamak, özel öğeler oluşturmak ve düzenli testler yapmak, herkesin kullanabileceği kapsayıcı uygulamalar oluşturmanın temel taşlarıdır. Unutmayın, erişilebilirlik bir özellik değil, bir zorunluluktur ve uygulamanızın kalitesini ve erişimini doğrudan etkiler. Bu makalede ele alınan iç yapıları ve en iyi uygulamaları benimseyerek, daha iyi bir dijital dünya inşa etme yolunda önemli bir adım atmış olursunuz.

SSS (Sık Sorulan Sorular)

SwiftUI'da erişilebilirlik neden önemlidir?

Erişilebilirlik, engelli bireylerin uygulamalarınızı kullanabilmesini sağlayarak daha geniş bir kitleye ulaşmanızı, yasal gereklilikleri karşılamanızı ve etik bir sorumluluğu yerine getirmenizi sağlar. Aynı zamanda, iyi tasarlanmış erişilebilirlik özellikleri genellikle tüm kullanıcılar için daha iyi bir deneyim sunar.

accessibilityLabel ile accessibilityHint arasındaki fark nedir?

accessibilityLabel, bir UI öğesini tanımlayan kısa bir etikettir (örn: "Gönder butonu"). accessibilityHint ise, öğenin ne yapacağını veya nasıl kullanılacağını açıklayan ek bir ipucudur (örn: "Formdaki bilgileri sunucuya gönderir."). VoiceOver önce etiketi, sonra ipucunu okur.

Erişilebilirlik ağacını nasıl görselleştirebilirim?

Xcode ile birlikte gelen "Accessibility Inspector" (Erişilebilirlik Denetçisi) aracını kullanarak uygulamanızın erişilebilirlik ağacını görselleştirebilir ve her bir öğenin özelliklerini (label, value, hint, traits vb.) inceleyebilirsiniz.

Karmaşık bir görünüm için erişilebilirliği nasıl sağlarım?

Karmaşık görünümlerde, accessibilityElement(children: .combine) ile ilgili öğeleri gruplayabilir veya accessibilityElement(children: .ignore) ile varsayılan gruplamayı devre dışı bırakıp her bir alt öğeyi ayrı ayrı etiketleyip yapılandırabilirsiniz. accessibilityRepresentation kullanarak da karmaşık bir görünümün erişilebilirlik ağacındaki temsilini basitleştirebilirsiniz.

VoiceOver ile test yaparken nelere dikkat etmeliyim?

VoiceOver ile test ederken, her öğenin doğru ve anlamlı bir şekilde etiketlendiğinden, gezinme sırasının mantıklı olduğundan, etkileşimli öğelerin beklendiği gibi çalıştığından ve özel eylemlerin tetiklendiğinden emin olun. Ayrıca, uygulamanın farklı engelli gruplarının ihtiyaçlarına yanıt verip vermediğini de göz önünde bulundurun.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık