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
- 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.
- Her sekme için, bir çocuk görüşü (örneğin, özel bir görüş veya özel bir görünüm) sağlar.
- 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:
- [FONT=0)Environment Objects [[DÜDÜT 1: 1): İndüktifa (DÜ) ile Âdem (İsviçre) : Âdem-i İmran (Şeref)
- [FONT:0]StateObject, paylaşılan bir yönetici ile ): Tekton veya gözlemlenebilir bir sınıf oluşturun ve aşağı geçin.
- [FONT=0]Seçim bağlayıcısı[[Dönetici: Basit değerler için, seçim durumu bir iletişim kanalı olarak hareket edebilir (örneğin, “Ben 2 sekmeye geçtim çünkü veriler hazır).
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.