Swiftui ile birlikte Multi-tab Interface'ı daha İyi Navigation için tasarlayın

SwiftUI, Apple'ın tüm Apple platformlarında kullanıcı arayüzü oluşturmak için uygun bir çerçeve, çok gelişmiş arayüzler oluşturmak için güçlü bir yol sunar. Tabbed navigasyon mobil ve masaüstü uygulamaları en yaygın desenlerden biridir, kullanıcıların sekme uygulama yapmadan hızlı bir şekilde geçiş yapmasına izin verir.

Bu makale SwiftUI ile çok gelişmiş arayüzler tasarlamak hakkında bilmeniz gereken her şey üzerinden yürür.En sonunda, kullanıcıların zevk aldığı en basit sekme uygulamaları ile donatılmış olacaksınız.

TabView'in Biçetmesini Anlayın

SwiftUI'deki sekme navigasyon kalbinde şöyledir:0)TabView[Dönetici: 1 ).Bir dizi çocuk görüşünü sunan bir konteyner görüşü, kullanıcının bir sekmeye dokunduğunda, ilgili görüş ortaya çıkar ve sekme bar, aktif durumu bir şekilde gösterir.

Layout and behavior

Varsayılan olarak, FLUTT:0)TabView[[Dönetici: 1 ), iOS'ta ekranın alt kısmında ve MacOS'ta ilk olarak cihaz yönlendirmesine adapte olur ve izlemeOS bir segmente tarzı kullanırsınız.

SF Sembolleri ile Tab Eşyaları

Apple, SF sembollerini sekme ikonları için kullanmayı önerir, çünkü cihazlar ve erişilebilirlik ayarlarında mükemmel bir şekilde ölçeklenirler.TheurFLT:0) modifier genellikle bir SF sembolü adı ve aENFLT:2 etiketi ile bir görüntü oluşturucu kabul eder. Örneğin:2

TabView {
 ContentView()
 .tabItem {
 Label("Home", systemImage: "house.fill")
 }
}

[FONT=0)Label[Dönetici:0) göre otomatik olarak bir ikon ve bir başlık birleştirir, uygun bir ayar ve erişilebilirlik etiketi sağlar.You can always fall back to separateTORT:4) andurFLT:5) Daha fazla kontrol için görüşlere geri dönebilirsiniz.

Temel Multi-Tab Interface

Basit bir sekme oluşturma uygulaması sadece birkaç kod hattı gerektirir. Üç sekme ile minimum örnek oluşturma: Ev, Arama ve Profil.

Adım-byStep Uygulama Uygulama

  1. Yeni SwiftUI görünümü (örneğin, [[Düzg.) oluşturun ve bir [[DüzD:0)TabView[DÜT:1) kökü olarak eklenir.
  2. Her sekme için, bir çocuk görüşü (örneğin, özel bir görüş veya özel bir görünüm) sağlar.
  3. Uygun bir SF sembolü ve yerelleştirilmiş bir dize ile modifier.

Kod Örnek Örnek Örnek

struct ContentView: View {
 var body: some View {
 TabView {
 HomeView()
 .tabItem {
 Label("Home", systemImage: "house.fill")
 }

 SearchView()
 .tabItem {
 Label("Search", systemImage: "magnifyingglass")
 }

 ProfileView()
 .tabItem {
 Label("Profile", systemImage: "person.crop.circle")
 }
 }
 }
}

struct HomeView: View {
 var body: some View {
 Text("Welcome Home")
 }
}

struct SearchView: View {
 var body: some View {
 Text("Find what you need")
 }
}

struct ProfileView: View {
 var body: some View {
 Text("Your profile")
 }
}

Bu kod, üç ürünle bir çalışma sekme barı üretir. Her sekme, seçilen SwiftUI'nin otomatik olarak aktif durumu ve geçiş animasyonlarını yönetirken ilgili içeriğini gösterir.

Tab Maddelerini Özelleştirin

Varsayılan görünüm temiz olsa da, uygulamanızın markasını eşleştirmek veya ekstra kullanıcı geri bildirim sağlamak için sekme çubuğunu sık sık incelemeye ihtiyacınız vardır.

İşaretler ve Göstergeler ekin

SwiftUI, çocuk görüşündeki modifier kullanarak herhangi bir sekmeye kötü bir yer eklemenize izin verir.Sesler küçük bir sayı veya metin gösterir (daha önce gelen bildirimlerin sayısı gibi).

TabView {
 InboxView()
 .tabItem { Label("Inbox", systemImage: "tray.fill") }
 .badge(5) // Shows a red badge with "5"

 SettingsView()
 .tabItem { Label("Settings", systemImage: "gearshape") }
}

Bir dizi ile kırmızı bir daire olarak görünür; diğer platformlarda, farklı şekilde farklı olabilir.

Değişen Tab Bar Görünümü (Tint Colors and background)

Seçilmiş sekmenin aksan rengini değiştirmek için, 15+'da modifier'i ayarlayın:0)TabView) (Yeni iOS sürümlerinde belirtilen) veya iOS 15+'da modifier kullanın:

TabView {
 // tabs...
}
.tint(.purple)

Daha gelişmiş bir özelleştirme için, özel bir arka plan veya şekli gibi, kullanıcı beklentilerini ve sistemi seviyesindeki jestleri kullanarak sistem sekme çubuğuna yapıştırın.

Devlet ve Seçim Yönetimi

Hangi sekmenin aktif olduğu kontrol etmek, derin bağlantı, kullanıcı tercihleri veya belirli bir eylemden sonra ilk sekmeye geri dönmek için önemlidir.

@State for Selection

Bind aFL:0)@State[[Dönetici: 1 ) Aynı türün etiket değerlerinin aynı türün bir değişkeni olarak algılanır.

struct ContentView: View {
 @State private var selectedTab = 0

 var body: some View {
 TabView(selection: $selectedTab) {
 HomeView()
 .tabItem { Label("Home", systemImage: "house.fill") }
 .tag(0)

 SearchView()
 .tabItem { Label("Search", systemImage: "magnifyingglass") }
 .tag(1)

 ProfileView()
 .tabItem { Label("Profile", systemImage: "person.crop.circle") }
 .tag(2)
 }
 }
}

[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=

Programmatic Tab Anahtarlama

Örneğin, ev sekmesinde “ Ayarları” düğmesine bir “Go to Settings” düğmesine bir bağlayıcıyı geçerek herhangi bir çocuk görüşünde sekmelerini değiştirebilirsiniz:

struct HomeView: View {
 @Binding var selectedTab: Int

 var body: some View {
 VStack {
 Text("Home")
 Button("Open Settings") {
 selectedTab = 2
 }
 }
 }
}

Bunu, çocuğun bakış açısını oluştururken bağlayıcı olarak aktararak, [[0)TabView) Bu size sekme durumunu bozmadan navigasyonla tam kontrol verir.

KullanıcıDefaults ile Zamanlayıcı Tab Seçimi

Kullanıcı dostu bir dokunuş için, uygulamanın yeniden başlamasından sonra son seçilen sekmeyi hatırlayın.UseurFLT:23) otomatik olarak seçimi devam ettirir:0)UserDefaults).

struct ContentView: View {
 @AppStorage("selectedTab") private var selectedTab = 0

 var body: some View {
 TabView(selection: $selectedTab) {
 // tabs...
 }
 }
}

Uygulama şimdi son ziyaret edilen sekmede başlatacaktır.

Gelişmiş Navigation Desenleri

Multitab uygulamaları genellikle navigasyon yığınları ile entegre etmek, gelen URL'leri işlemek veya sekmeler arasındaki verileri paylaşmak gerekir.

TabView ile Kombine Çıkmak

Her sekme kendi [[Dizit:25) içerebilir (veya [[Eski SwiftUI'de ..) Bu, sekme barı görünürken ayrıntılı görüşlere izin verir.

struct HomeView: View {
 var body: some View {
 NavigationStack {
 List(1..<20) { item in
 NavigationLink("Item \(item)", value: item)
 }
 .navigationDestination(for: Int.self) { item in
 DetailView(item: item)
 }
 .navigationTitle("Home")
 }
 }
}

sekmenin çocuk görüşünün içinde yer alan, [[TabView[Dönetici:0)TabView[[Dönetici: 1 ), sekmedeki ayrı navigasyon yığınlarını korumak için önerilen bir modeldir.

Deep Links

Uygulamanız evrensel bir bağlantı veya özel bir URL programı aldığında, belirli bir sekmeye geçiş yapmanız ve opsiyonel olarak alt görüşe yol açmanız gerekebilir.ŞUygunT:0)TabView) ve URL'yi seçim durumuna veya navigasyona yönlendirmek için yapmanız gerekebilir.

TabView(selection: $selectedTab)
 .onOpenURL { url in
 // e.g., myapp://tab/2
 if let tabNumber = extractTab(from: url) {
 selectedTab = tabNumber
 }
 }

Daha karmaşık senaryolar için, bir [[DüzFLT:31) ile bir araya gelir.

Tablar Arasında Veri Geçmek

Çünkü her sekmenin kendi bakış hiyerarşisi vardır, aralarındaki verileri aktarın ortak bir devlet kaynağı gerektirir: Seçenekler şunları içerir:

Aşırılıktan kaçının; verileri mümkün olduğunda tek yönlü tutmayı sağlayın.

Accessability and User Experience

En geniş seyirciye ulaşmak için erişilebilir bir sekme arayüzü önemlidir. SwiftUI yerleşik erişilebilirlik desteği sağlar, ancak bunu doğrulamalı ve geliştirmelisiniz.

Seslendirme Desteği

Tab öğeleri otomatik olarak, [[0)Label) veya her sekmenin amacının açıkça ifade ettiğini test edin.Özel sekme barları için, [[Ücretsiz: 0,35|Sistem davranışını taklit etmek için.

Klavye Navigation

Bir donanım klavyesi ile iPadOS'ta kullanıcılar, Komut-[sayı) veya Seçenek-Tab. SwiftUI'surFLT:0)TabView) bu davranışı otomatik olarak devralın.Özel sekme uygulamanızın aynı zamanda modifier.

Adaptif Layouts

Peyzaj modunda iPhone'larda, sekme bar farklı görünebilir. iOS 15 ve daha sonra, tablo barı uzay sınırlı olduğunda kompakt olmasına izin verebilir. sekme içeriği [[ŞampFLT:38) daha iyi bir okuma veya etkileşim deneyimi sağlamak için ayarlayabilirsiniz.

SwiftUI ile Özel Tab Bars

Bazen sistem sekme barından sapmak için bir tasarıma ihtiyacınız var - e.g., ortadaki bir yüzen düğme, bir eğri şekli veya animasyon ikonları.Bazı yerleşik davranışları kaybettiğiniz halde (örneğin güvenli alan gibi) SwiftUI özel sekme barları basitleştirir.

TabView'i özel Şekillerle Yeniden Tanımlama

Aşağıdaki düğmelerin üzerinde bulunan özel bir görünüm oluşturun.Sesinde overlaid'in düğmeleri üzerinde.UseurFLT:40) seçimi için ve içeriği bir hesaplanmış mülk veya algFLT:41 içinde ifade edin.

struct CustomTabView: View {
 @State private var selection = 0

 var body: some View {
 VStack(spacing: 0) {
 // Content area
 Group {
 if selection == 0 {
 HomeView()
 } else if selection == 1 {
 SearchView()
 } else {
 ProfileView()
 }
 }
 .frame(maxWidth: .infinity, maxHeight: .infinity)

 // Custom tab bar
 HStack {
 TabBarButton(icon: "house.fill", label: "Home", isSelected: selection == 0)
 .onTapGesture { selection = 0 }
 Spacer()
 TabBarButton(icon: "magnifyingglass", label: "Search", isSelected: selection == 1)
 .onTapGesture { selection = 1 }
 Spacer()
 TabBarButton(icon: "person.fill", label: "Profile", isSelected: selection == 2)
 .onTapGesture { selection = 2 }
 }
 .padding(.horizontal)
 .padding(.top, 8)
 .background(Color(uiColor: .systemBackground)
 .shadow(radius: 2))
 }
 .ignoresSafeArea(.keyboard) // Prevent tab bar from moving with keyboard
 }
}

Tür Geçişleri

Anahtarlama sekmelerini bir şekilde kapatarak, örneğin bir slayt veya opaklık geçişi ekleyin. iOS 17+ (örneğin, çürük veya pul puls gibi) kullanarak kendi ikonunu da animatelayabilirsiniz.

Performans Optimizasyonu Performans Optimizasyonu

Multitab uygulamaları hafızadan acı çekebilir, eğer tüm sekmeleri istekli bir şekilde yükseniz, SwiftUI'sETHFLT:0)TabView[D: 1) varsayılan olarak tembeldir: sadece seçilen sekme için görünüm yaratır ve verir. ancak, eğer devlet tarafından takdir edilirseniz, hala optimize etmek isteyebilirsiniz.

Lazy Yükleme Tab Content

[[Kategori: · 9|15|15||Dinler, · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Memory Leaks

Çünkü sekmeler genellikle notları iletilir, ancak görüntü hafızada tutulamaz, sekmenin seçilinceye kadar başlangıç yapmamalısınız.

Tabbed Interface'i test et

Otomatik testler, sekme navigasyonun cihaz eyaletlerde doğru şekilde çalışmasını sağlar.

Tab Selection için Birim Testleri

Çünkü sekme görüşünüz bir değişken tarafından yönlendirilir, örneğin, derin bir bağlantının doğru parslar ve sekme indeksini atadığını test edebilirsiniz.

func testTabSelectionViaDeepLink() {
 let url = URL(string: "myapp://tab/2")!
 let tabNumber = extractTab(from: url)
 XCTAssertEqual(tabNumber, 2)
}

XCTestleri ile UI Testleri

Bir sekme öğesinin doğru içeriği görüntülerken XCUITest'i kullanın. Anahtarlama veya erişilebilirlik tanımlayıcıları tarafından erişim sekme öğeleri.

func testTappingSearchTab() {
 let app = XCUIApplication()
 app.launch()

 let searchTab = app.tabBars.buttons["Search"]
 XCTAssertTrue(searchTab.exists)
 searchTab.tap()
 XCTAssertTrue(app.staticTexts["Find what you need"].exists)
}

Gerçek Dünya Örneği: Çok-Tab Dashboard

Pratik bir örnekle her şeyi bir araya getirelim: Üç sekme ile bir pano uygulaması - Genel Bakış, Analytics ve Ayarlar.

Genel bakış Tab

Anahtar ölçümlerin (gün aktif kullanıcılar gibi), bir kaydırmalı olarak [[FONTD: 5 ) Detaylı raporlara izin vermek için.The sekme seçimi devam etmektedir.

Analytics Tab

Swift Charts ile inşa edilen grafikler ve grafikler ağır olabilir, görüntü oluşturma görüntüyü işaret eder:60) ve yalnızca sekme görünürken yükleme verilerini tetikler.

Ayarlar Tab

Bu sekme, kullanıcı oturumu içeren bir ortama erişime ihtiyaç duyar.Bunu beğen:61) Tüm sekmelerin aynı verileri paylaşmasını sağlar.

Common Pitfalls ve Çözümleri

Hatta deneyimli SwiftUI geliştiricileri, 15.TabView[Dönetici:0) ile birkaç tekrarlanan konuya giriyor.

Tab Bar, Navigasyon Stack'te Kayboluyor

Bir sekmenin içinde bir navigasyon yığınına bir bakış atarsanız, sekme barı itmeye devam edebilir. Çözüm: kullanım [[ENFLT:62) (iOS 16+) yerine, [[BİLMİŞK:63|-> sekme barı görünür.

Incorrect Tag Değerleri

Her çocuğa ait olarak, sekme görüşü doğru seçime layık olmayabilir. Her zaman ayrı ayrı, her sekme için kullanılabilir bir etiket sağlayabilir.

Tab View Retah State

Bazen sekmeleri geçiş yaparken, çocuk görüşünin durumu sıfırlanır. Bu tasarım tarafından yapılır - SwiftUI her seferinde, tabloların üzerinden durumu görüntülemek için ihtiyaç duyar.Kabul noktaların üzerinden devletini korumak veya kullanımı için:66.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

SwiftUI ile çok sayıda arayüz tasarlamak hem basit hem de derinden özelleştirilebilir.TheurFLT:0)TabView[[Dönetici: 1) Cihazın size sağlam bir temel verir ve birkaç ekstra kodla kötüler ekleyebilirsiniz, eyalet entegre navigasyon yığınları ve hatta tamamen özel sekme barlar inşa edebilirsiniz.En iyi uygulamalar için aşağıdaki gibi, performans ve testler için, tüm Apple platformlarında ölçekler oluşturacaktır.

[FONT=0) Apple'ın resmi TabView belgelerini (FLT:2) incelemek, sekme barları için insan arayüzü yönergelerini öğrenmek ) ve [[Döneticileri ile deneyerek deneyin)[Döneticilerinizi iptal etmek için.