Ana içeriğe geç
  1. 100 Günde SwiftUI Notları/

45.Gün - SwiftUI Navigation: Navigaiton Bar Özelleştirme

SwiftUI navigation’da Navigation Bar görünümünü özelleştirmeyi inceleyeceğiz. Bu sayede toolbar butonlarını tam konumlara yerleştirebilecek ve navigation title’ın editlenmesini sağlayabileceğiz.

iOS, navigation bar’ın belirli bir şekilde görünmesini ister, ancak stilini belirli ölçüde kontrol edebilme imkanımız vardır.

İlk olarak, büyük veya inline navigation title stillerini gördük, bu da bize üstte büyük veya küçük metin sağladı. Örneğin bu bize küçük bir title verecektir.

NavigationStack {
    List(0..<100) { i in
        Text("Row \(i)")
    }
    .navigationTitle("Title goes here")
    .navigationBarTitleDisplayMode(.inline)
}

SwiftUI Inline Navigation Title

En üstteki navigation bar’ın varsayılan olarak görünmez olduğunu göreceksiniz, ancak biraz yukarı kaydırır kaydırmaz düz gri bir arka plana sahip olur, böylece title’ı listenin içeriğinden açıkça öne çıkarır.

SwiftUI Navigation Title Visible

SwiftUI bunu biraz özelleştirmemize izin veriyor: bu arka plan için kullanılacak alternatif bir renk belirleyebiliyoruz. Unutmayın, bu yalnızca liste navigation bar altına kaydırıldığında görünür, bu yüzden ilk başta göremezsiniz.

Denemek için bunu navigationBarTitleDisplayMode() altına ekleyin;

.toolbarBackground(.blue)

SwiftUI Navigation Bar Color Change

Uygulamayı çalıştırıp biraz kaydırdığınızda, navigation bar’ın düz mavi bir renge dönüştüğünü görecektiniz. Ayrıca title’ın okunmasının zor olabileceğini göreceksiniz, çünkü light modda siyah olacaktır.

Bir önceki modifier’ın altına başka bir modifier ekleyerek bunu düzeltebilir, navigation bar’ı her zaman dark mod’a kullanmaya zorlayabilirsiniz, bu da title metninin beyaz olacağı anlamına gelir.

.toolbarColorScheme(.dark)

Navigationbar Title Color

💡 İpucu : Daha sonra başka tür toolbar’lar ile de karşılaşacaksınız. Bu iki modifier tüm bar’ları etkiler, ancak yalnızca navigation bar’ı değiştirmek istiyorsanız, her iki modifier’a da ikinci parametre olarak for: .navigationBar öğesini eklemelisiniz.

Navigation bar’ı özelleştirmenin son bir yolu daha var: her zaman veya uygulamanızdaki mevcut duruma göre gizleyebilirsiniz.

Bunu yapmak için, tüm barlar veya sadece navigation bar’da kullanılmak üzere .hidden olarak ayarlanmış toolbar() modifier’ına ekleyin;

.toolbar(.hidden, for: .navigationBar)

NavigationBar Hidden

Toolbar’ı gizlemek yeni view’lara gitmenizi engellemez, ancak kaydırılan view’ların saat gibi sistem bilgilerinin altına girmesine neden olabilir.

Toolbar Butonlarını Tam Konumlara Yerleştirme #

NavigationStack toolbar’a buton yerleştirirseniz, SwiftUI bunları kodunuzun çalıştığı platforma göre otomatik olarak yerleştirecektir. Burada iOS uygulamaları geliştiriyoruz, bu da butonların İngilizce gibi soldan sağa okunan dillerde navigation bar’ın sağ tarafına yerleştireleceği anlamına geliyor.

İsterseniz bunu ToolbarItem kullanarak özelleştirebilirsiniz. Bu, toolbar butonlarının etrafında bulunur ve çeşitli seçeneklerden birini seçerek onları tam olarak istediğiniz yere yerleştirmenize olanak tanır.

Örneğin, şu şekilde sola dayalı bir yerleştirme isteyebiliriz.

NavigationStack {
    Text("Hello, world!")
    .toolbar {
        ToolbarItem(placement: .topBarLeading) {
            Button("Tap Me") {
                // button action here
            }
        }
    }
}

Toolbar Left-Hand Alignment

Bu iyi çalışsa da, genellikle semantik seçeneklerden birini kullanmak daha iyidir- sadece konumlarına güvenmek yerine belirli bir anlamı olan yerleştirme. Şunları içerir;

  • .confirmationAction kullanıcıların, hizmet şartları gibi bir şeyi kabul etmesini istediğimizde.
  • .destructiveAction kullanıcının üzerinde çalıştığı şeyi yok etmek için bir seçim yapması gerektiğinde, örneğin oluşturduğu bazı verileri kaldırmak istediğini onaylamak gibi.
  • .cancellationAction kullanıcının yaptığı değişikliklerden geri dönmesi gerektiğini, örneğin yaptığı değişiklikleri atmak gibi.
  • .navigation kullanıcının veriler arasında hareket etmesini sağlayan butonlar için kullanılır, örneğin bir web tarayıcısında geri ve ileri gitmek gibi.

Bu semantik yerleştirmelerin iki önemli faydası vardır. Birincisi, iOS butonlarınızın ne işe yaradığı hakkında ekstra bilgiye sahip olduğu için ekstra stil ekleyebilir, örneğin bir onay butonu kalın olarak oluşturulabilir. İkincisi, bu konumlar diğer platformlara otomatik olarak uyarlanır, böylece butonumuz iOS, macOS, watchOS ve daha fazlasında her zaman doğru yerde görünür.

💡 İpucu : Kullanıcının bir değişikliği kaydetme veya iptal etme arasında karar vermesini istiyorsanız, navigationBarBackButtonHidden() modifier’ını eklemek isteyebilirsiniz, böylece bir seçim yapmadan çıkmak için Back’e dokunamazlar.

Aynı yerleşimi kullanan birden fazla buton istiyorsanız, ToolbarItem öğesini şu şekilde tekrarlayabilirsiniz.

.toolbar {
    ToolbarItem(placement: .topBarLeading) {
        Button("Tap Me") {
            // button action here
        }
    }

    ToolbarItem(placement: .topBarLeading) {
        Button("Or Tap Me") {
            // button action here
        }
    }
}

Veya bunun gibi ToolbarItemGroup kullanabilirsiniz.

.toolbar {
    ToolbarItemGroup(placement: .topBarLeading) {
        Button("Tap Me") {
            // button action here
        }

        Button("Tap Me 2") {
            // button action here
        }
    }
}

Her ikisi de aynı sonucu verecektir.

Temel navigationTitle() modifier, navigation bar’da aşağıdaki gibi bir string görüntülememizi sağlar.

struct ContentView: View {
    var body: some View {
        NavigationStack {
            Text("Hello, world!")
                .navigationTitle("SwiftUI")
        }
    }
}

SwiftUI Default Navigation Title

Ancak .inline title display mode’u kullanıyorsanız, navigationTitle() methoduna bir binding da iletebilirsiniz. Bu daha sonra her zamanki gibi görüntülenecektir, ancak önemli bir farkla: iOS, title’ın yanında küçük bir ok gösterecek ve başlığı değiştirmek için bir “Yeniden Adlandır” butonu ortaya çıkaracaktır.

İşte kodda nasıl göründüğü;

struct ContentView: View {
    @State private var title = "SwiftUI"

    var body: some View {
        NavigationStack {
            Text("Hello, world!")
                .navigationTitle($title)
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

Navigation Title Edit

Bu, title’ın kullanıcı tarafından girilen bir şeyin adını yansıttığı zamanlar için harikadır, çünkü layout’a fazladan bir text field eklememize gerek olmadığı anlamına gelir.


Bu yazıyı İngilizce olarak da okuyabilirsiniz.
You can also read this article in English.

Bu yazı, SwiftUI Day 45 adresinde bulunan yazılardan kendim için aldığım notları içermektedir. Orjinal dersi takip etmek için lütfen bağlantıya tıklayın.