Table of Contents
סוויפט, המסגרת ההצהרתית של אפל לבניית ממשקי משתמשים בכל פלטפורמות אפל, מספקת דרך עוצמתית אך פשוטה ליצור ממשקים רב-טאב.Tab ניווט הוא אחד הדפוסים הנפוצים ביותר באפליקציות ניידות ושולחן שולחניות, המאפשרים למשתמשים לעבור במהירות בין חלקים נפרדים ללא הפסד הקשר.אם אתה בונה אפליקציה חדשות חד-פעמיות תוכן, לוח-חלון או פאנל, FLTRETRET עבור רכיב הניווט 1-FView הוא יישום 1.
מאמר זה עובר את כל מה שאתה צריך לדעת על עיצוב ממשקים רב-טאב עם SwiftUI. החל עם היסודות של FLT:0TabViewofLT:1, אנו נבחן התאמה אישית, ניהול המדינה, דפוסים מתקדמים, נגישות, ביצועים ודוגמאות בעולם האמיתי.
המונחים: tabView Component
בלב הניווט של הכרטיסייה ב- SwiftUI הוא FLT:0TabViewofLT:1 . זה נוף מיכל המציג סט של צפיות בילדים, כל אחד שקשור לפריט הכרטיסיה.כאשר המשתמש מקל על הכרטיסיה, תצוגת התואם מוצגת, ובר הכרטיסיה מראה את המדינה הפעילה עם דגש.
המונחים: putout and Behavior
כברירת מחדל, (FLT:0)TabViewFLT:1 הופך את בר הכרטיסייה בתחתית המסך על iOS ובראש על macOS. iPadOS להסתגל לנטיית המכשיר, ו watchOS משתמש בסגנון מופרע.You לא צריך לנהל את הפריסה של הכרטיסייה עצמה; Swift מטפל במיקום, מתפתל, מזייף, אנימציה ובחירת הכרטיסייה.
פריטים עם סמלים SF
אפל ממליצה להשתמש בסמלי SF עבור אייקונים כרטיסיות כי הם בקנה מידה מושלם על פני התקנים והגדרות נגישות.המודולים של ה-FLT:0 מקבל בונה נוף שבו אתה בדרך כלל מציב מקור 1FLT עם שם סמל SF ו- (FLT:2 תווית: לדוגמה:
TabView {
ContentView()
.tabItem {
Label("Home", systemImage: "house.fill")
}
}
(ב) השקפה זו משלבת באופן אוטומטי סמל וכותרת, הבטחת יישור הולם ותיוגויות נגישות.You תמיד יכול ליפול חזרה להפרדה בין FLT:4 ו-FLT:5 צפיות עבור שליטה נוספת.
בניית ממשק רב-טאב בסיסי
יצירת אפליקציה פשוטה של טבילה דורשת רק כמה שורות קוד.בואו נבנה דוגמה מינימלית עם שלוש כרטיסיות: בית, חיפוש ופרופיל.
שלב-בי-שלב
- (ב) עיין ב[[המאה ה-20]], [[1924]] ו[[1924]], [[1924]]]]
- לכל כרטיסה, יש להציג בפני הילד (כגון: קונסול 7) או מבט מותאם אישית.
- נספח: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
דוגמה קוד
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")
}
}
קוד זה מייצר בר לשוניות עבודה עם שלושה פריטים.כל הכרטיסיה מראה את התוכן המתאים שלה כאשר נבחר. SwiftUI באופן אוטומטי לנהל את מצב פעיל ואת האנימציה מעבר.
עקבו אחרי Tab items
בעוד המראה ברירת המחדל הוא נקי, לעתים קרובות אתה צריך להתאים את בר הכרטיסייה כדי להתאים את המותג של האפליקציה שלך או לספק משוב נוסף למשתמש.
הוספת Badges ו-אינדיקטורים
SwiftUI מאפשר לך לצרף תג לכל פריט לשוני באמצעות המודול 10 (FLT:10) המאמת את ראיית הילד. Badges להציג מספר קטן או טקסט (כמו ספירת הודעות לא קוראות).
TabView {
InboxView()
.tabItem { Label("Inbox", systemImage: "tray.fill") }
.badge(5) // Shows a red badge with "5"
SettingsView()
.tabItem { Label("Settings", systemImage: "gearshape") }
}
ביצות מעדכנות באופן אוטומטי כאשר הן קשורות ל-FLT:0 (@statecioFLT:1) או נצפו רכוש. ב- iOS, התג מופיע כעיגול אדום עם מספר; בפלטפורמות אחרות, הוא עשוי להפוך שונה.
שינוי מראה Tab Barance (Tint Colors andרקע)
כדי לשנות את צבע המבטא של הכרטיסייה שנבחרה, להגדיר את המדגם של קונסולת:12 על ה-FLT:0 (TabViewFLT:1 (התקבל בגרסאות iOS חדשות יותר) או להשתמש במודול ה-FLT:13 מודולר ב- iOS 15+:
TabView {
// tabs...
}
.tint(.purple)
לקבלת התאמה מתקדמת יותר, כגון רקע או צורה מותאם אישית, אתה יכול להשתמש ב-FLT (:15 דרך FLT:16 או לבנות בר לשונית מותאם אישית לחלוטין באמצעות ערימה אופקית של כפתורים (ראה סעיף הכרטיסייה מותאם אישית מאוחר יותר).
ניהול המדינה ובחירת
בקרה אשר הכרטיסיה פעילה היא חיונית לתכונות כמו קישור עמוק, העדפות משתמשים, או תיקון היישום לכרטיסיה הראשונה לאחר פעולה מסוימת.
שימוש ב- @state for Selection
(ב) ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]
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)
}
}
}
כאשר שינויים (למשל, באמצעות כפתור על המסך הביתי), תצוגת הכרטיסייה עוברת באופן אוטומטי לכרטיסיה המקבילה. גישה זו מאפשרת לך לקרוא את הכרטיסייה הנוכחית במקום אחר באפליקציה שלך.
המונחים: tab Switching
אתה יכול לשנות כרטיסיות מבפנים כל מבט של ילד על ידי העברת מחייבת למשתנה הבחירה.לדוגמה, כפתור "Go to Settings" בכרטיסיה הביתית:
struct HomeView: View {
@Binding var selectedTab: Int
var body: some View {
VStack {
Text("Home")
Button("Open Settings") {
selectedTab = 2
}
}
}
}
ליזום זאת על ידי העברת החייב בעת יצירת ראיית הילד בתוך ה-FLT:0.10.TabViewveFLT:1 זה נותן לך שליטה מלאה על ניווט מבלי לשבור את מצב הכרטיסיה.
עריכת קוד מקור | Netflix with UserDefaults
(ב) למגע ידידותי למשתמש, זכור את הכרטיסיה שנבחרה האחרונה לאחר שהאפליקציות מחדשות את השימוש ב-FLT:23 כדי להתמיד באופן אוטומטי בבחירה ל-FLT:0UserDefaultsveFLT:1:
struct ContentView: View {
@AppStorage("selectedTab") private var selectedTab = 0
var body: some View {
TabView(selection: $selectedTab) {
// tabs...
}
}
}
האפליקציה תפעיל כעת את הכרטיסיה שהמשתמש ביקר לאחרונה.
דפוסי ניווט מתקדמים
יישומים רב-טאב לעתים קרובות צריכים להשתלב עם ערימות ניווט, לטפל בכתובות כתובות הנכנסות, או לשתף נתונים בין כרטיסיות.
שילוב של TabView עם ניווט
כל כרטיסה יכולה להכיל את ה-FLT:25 (או FLT:26) שלה (או FLT:26) ב- SwiftUI מבוגר יותר, זה מאפשר לקדוח לתוך תצוגות מפורטות בתוך הכרטיסייה בעוד הבר הכרטיסיה נשאר גלוי.
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")
}
}
}
במקום זאת, במקום ה-FLT:28 בתוך תצוגת הילד של הכרטיסייה, לא מחוץ ל-FLT:0TabViewFLT:1, כדי לשמור על מחסניות ניווט נפרדות לכל הכרטיסיה.
קשר עמוק
כאשר האפליקציה שלך מקבלת קישור אוניברסלי או תוכנית כתובת URL מותאמת אישית, ייתכן שיהיה עליך לעבור לכרטיסיה מסוימת ול לנווט באופן אופציונלי ל- sub-view. השתמש במודול המכוון של ה-FLT:0TabViewFLT:1 (או תצוגת השורש) ולהפיץ את כתובת ה-URL כדי לעדכן את המדינה או להפעיל ניווט.
TabView(selection: $selectedTab)
.onOpenURL { url in
// e.g., myapp://tab/2
if let tabNumber = extractTab(from: url) {
selectedTab = tabNumber
}
}
לתרחישים מורכבים יותר, לשלב את ה-FLT:31 עם נתיב משותף (FLT:32).
העברת נתונים בין Tabs
מכיוון שלכל הכרטיסיה יש היררכיה משלה, העברת נתונים ביניהם דורשת מקור מדינה משותף.
- (ב) ויקרא י"ד: "ה' אֱלֹהֶיךָ" (בראשית כ"ד, ט)
- (ב) ,0) ,Ubject עם מנהל משותף של ההרחבה: צור רווקה או מחלקה בלתי ניתנת לערעור ולעבור אותה.
- (הופנה מהדף סעיף 1:0) לקביעת הבחירה המחייבת את ה- 1 בינואר: לערכים פשוטים, מדינת הבחירה עצמה יכולה לפעול כערוץ תקשורת (למשל, "עברתי לכרטיסיה 2 כי הנתונים מוכנים").
להימנע מתוספת יתר; לשמור על זרימת נתונים חד-כיווני במידת האפשר.
נגישות וחווית המשתמש
ממשק לשוני נגיש הוא חיוני כדי להגיע לקהל הרחב ביותר. SwiftUI מספק תמיכה הנגישות בנוי, אבל אתה צריך לאמת ולשפר אותו.
תמיכה ב- VoiceOver
פריטים טבילה מקבלים באופן אוטומטי תוויות נגישות מן ה-FLT:0Labelalph 1 או טקסט שאתה מספק.מבחן שכל הכרטיסיה מעבירה את מטרתו באופן ברור.
ניווט Keyboard
ב-iPadOS עם מקלדת חומרה, משתמשים יכולים לנווט בין כרטיסיות באמצעות Command- [מספר] או Option-Tab. SwiftUI's FLT:0TabViewFLT:1 יורשים התנהגות זו באופן אוטומטי.
המונחים: tiouts
באייפון במצב נוף, בר הכרטיסייה עשוי להופיע אחרת. iOS 15 ואילך לאפשר לבר הכרטיסייה קומפקטי כאשר שטח מוגבל.You יכול להתאים את התוכן הכרטיסיה עם FLT:38 כדי לספק חוויית קריאה טובה יותר או אינטראקציה.
בית תגיות: SwiftUI
לפעמים אתה צריך עיצוב כי מתפתל מן הבר של מערכת כרטיסיות - למשל, כפתור צף באמצע, צורה מעוגלת, או אייקונים אנימציה. בעוד שאתה מאבד כמה התנהגויות בנוי (כמו אינסטלטים שטח בטוח), SwiftUI עושה ברים לשוניים מותאם אישית פשוט.
עקבו אחרי Custom Shapes
(ב) עיין ב[[1924]] ב[[1924]], ב[[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]
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
}
}
המונחים: tab Transitions
הוסף מעברים חלקיים בעת החלפת כרטיסיות על ידי עוטפת התוכן בלוק (FLT:44 ), לדוגמה, להוסיף שקופיות או שינוי סודיות.You יכול גם להונות את הסמל עצמו באמצעות FLT:45:45:45:45 על iOS 17+ (כמו קפיצה או דופק).
אופטימיזציה
יישומים רב-טאב יכולים לסבול מנפיחות בזיכרון אם אתה לטעון את כל הכרטיסיות בשקיקה.ה- SwiftUI:0TabViewveFLT:1 עצלן כברירת מחדל: זה רק יוצר ועושה את הנוף עבור הכרטיסיה שנבחרה.
המונחים: tab content
השתמש ב-FLT:46 או FLT:47 בתוך כרטיסיות כדי להדוף את הבריאה עד לגלול חישובים מורכבים בנקודת ההתחלה של תצוגות הילד; במקום זאת, להסתמך על FLT:48 כדי להתחיל טעינה נתונים.
להימנע מזיכרון
מכיוון שכרטיסיות לעיתים קרובות מחזיקות אזכורים למקרים משותפים, ודאו כי אין ליצור מחזורי התייחסות חזקים מיותרים. השתמש ב-FLT:50 עבור אובייקטים בבעלות ו-FLT:51 עבור אלה משותפים.אם הכרטיסיה לעולם לא מוצגת, ייתכן שהתמונה עדיין מוחזקת בזיכרון - שימוש ב-FLT:52 (עטיפה אישית) כדי לדחות את ההתחלתיזציה עד לכרטיסיה נבחרת.
עקבו אחרי Tabbed Interface
בדיקות אוטומטיות מסייעות להבטיח כי ניווט הכרטיסייה פועל כראוי על פני מדינות המכשיר.
מבחן ליחידה עבור בחירת Tab
מכיוון שתפיסת הכרטיסייה שלך מונעת על ידי משתנה FLT:53, אתה יכול לבדוק את ההיגיון שמשנה את הלוגיקה (FLT:54 לדוגמה, לאמת כי קישור עמוק מתאים כראוי מכנה ומקצה את אינדקס הכרטיסייה.
func testTabSelectionViaDeepLink() {
let url = URL(string: "myapp://tab/2")!
let tabNumber = extractTab(from: url)
XCTAssertEqual(tabNumber, 2)
}
בדיקות עם XCTest
השתמש ב- XCUITest כדי לאמת כי הזיעה של פריט הכרטיסייה מציגה את הפריטים הנכונים. Access בכרטיסיה על ידי התווית או מזהה הנגישות שלהם.
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)
}
דוגמה אמיתית לעולם: לוח הבקרה הרב-טאב
בואו נאחד הכל יחד עם דוגמא מעשית: אפליקציה לוחמת עם שלוש כרטיסיות - סקירה, Analytics והגדרות.
המונחים: tab
מציג סיכום של מדדים מרכזיים (כמו משתמשים פעילים יומיומיים, הכנסות) במגילה (FLT:57 שימושים FLT:58) כדי לאפשר לקדוח לדיווחים מפורטים.
Analytics
מכיל תרשימים וגרפים שנבנו עם Swift Charts. כי תרשים יכול להיות כבד, לסמן את הנוף כמו FLT: 60 ו לעורר את העמסה נתונים רק כאשר הכרטיסיה מופיעה.
הגדרות Tab
מציג רשימה של משקפי, קישורים, כפתור לוט.כרטיסיה זו עשויה להיות צריכה גישה לאובייקט סביבה המכיל את הפגישה המשתמש.עבור את זה באמצעות FLT:61 מבטיחה לכל הכרטיסיות לשתף את אותו הנתונים.
מלכודות ופתרונות
אפילו מפתחים מנוסים של SwiftUI לרוץ לכמה נושאים חוזרים עם 0 (TabViewFillo: 1).
טבילה ב-Strocast
אם אתה דוחף מבט על ערימה ניווט בתוך הכרטיסיה, הבר הכרטיסיה עשוי להיעלם על פני לדחוף.פתרון: שימוש ב-62 (iOS 16+) במקום FLT:63 - הבר הכרטיסייה נשאר גלוי.
ערכים טאג נכונים
אם אתה לא להקצות את ה-FLT:65 לכל ילד, תצוגת הכרטיסייה עשויה לא לכבד את הבחירה מחייבת כראוי.תמיד לספק תג ייחודי, חדיר לכל הכרטיסיה.
בית הכנסת: איפוס המדינה
לפעמים, כאשר החלפת כרטיסיות, מצב האפסים של הילד, זה על ידי עיצוב - SwiftUI יוצר מקרה חדש של ראיית הילד בכל פעם שהוא צריך להציג אותו.כדי לשמר את המדינה על פני מתגי הכרטיסיה, להרים את המדינה לתוך נוף ההורה או להשתמש ב-FLT:66 ברמה מעל FLT:0TabViewFalph 1LT:1, שימוש אלטרנטיבי, LTF:67 עבור נתונים משותפים לא צריך ליישב נתונים.
מסקנה
עיצוב ממשק רב-טאב עם SwiftUI הוא פשוט מאוד מותאם אישית.ה-FLT:0.TabViewFLT:1 רכיב נותן לך בסיס מוצק, ועם כמה שורות נוספות של קוד אתה יכול להוסיף תגים, לנהל מדינה, לשלב מחסניות ניווט, ואפילו לבנות ברים לשוניים מותאם אישית לחלוטין.
המשך לחקור על ידי צלילה ל-FLT:0 (הרשמית הרשמית של אפל) תיעוד TabViewsFLT 1:1, ללמוד על FLT:2human ממשק הנחיות עבור כרטיסיות ראטFLT 3, וניסוי עם התפלגות 4SF:5 לתת את הכרטיסיות שלך מראה מלוטש, מערכת עקבי.