Erstellen Sie mit SwiftUI 2.0 eine benutzerdefinierte Registerkartenansicht

API in Swift UI 2.0 hinzugefügt

Ich wollte den in SwiftUI 2.0 hinzugefügten "PageTabViewStyle" verwenden, also habe ich so etwas wie eine benutzerdefinierte Registerkarte erstellt.

Formular vorerst ausgefüllt

Ich würde gerne so etwas machen. 999.gif GitHub ist da. https://github.com/hoshi005/custom-tab

Entwicklungsumgebung

Vorbereitungen

Erstellen eines Tab-Teils

スクリーンショット 2020-10-21 21.12.23.png

Da die Animations-GIF-Datei so benannt und platziert wurde, wird die Aufzählung durch Abgleichen der Namen definiert.

enum TabItem: String, CaseIterable {
    case piyo
    case pen
    case neko
    case tobipen
    
    var name: String {
        "\(self.rawValue).gif"
    }
}

Ich habe eine "TabItemView" hinzugefügt, um jede Registerkarte darzustellen, und sie wie folgt definiert.

struct TabItemView: View {
    
    let tabItem: TabItem
    @Binding var selected: TabItem
    
    var body: some View {
        //SDWebImageSwiftUI-Import erforderlich.
        AnimatedImage(name: tabItem.name)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 40)
            .onTapGesture {
                selected = tabItem //Tippen Sie auf, um sich selbst auszuwählen.
            }
    }
}

In der Haupt-ContentView ist die Registerkartenansicht wie folgt definiert.

struct ContentView: View {
    
    //Registerkartenauswahl und Anfangswerte.
    @State private var selected: TabItem = .piyo
    
    var body: some View {
        
        //Tab-Ansichtsteil.
        HStack {
            ForEach(TabItem.allCases, id: \.self) { tabItem in
                TabItemView(tabItem: tabItem, selected: $selected)
            }
        }
        .padding(.vertical, 10.0)
        .padding(.horizontal, 20.0)
        .background(Color.white.clipShape(Capsule()))
        .shadow(color: Color.black.opacity(0.3), radius: 5, x: -5, y: 5)
    }
}

Hier ist das fertige Produkt. Bei dieser Geschwindigkeit verstehen Sie den Auswahlstatus nicht wirklich. 001.gif

Passen Sie das Erscheinungsbild so an, dass Sie den ausgewählten Status sehen können

Schreiben Sie "TabItemView" wie folgt um, um das Erscheinungsbild zu ändern, wenn es ausgewählt / nicht ausgewählt ist.

var body: some View {
   AnimatedImage(name: tabItem.name)
       .resizable()
       .aspectRatio(contentMode: .fit)
       //Passen Sie die Größe und den Abstand entsprechend dem Auswahlstatus an.
       .frame(width: tabItem == selected ? 100 : 40)
       .padding(.vertical, tabItem == selected ? -30 : 0)
       .padding(.horizontal, tabItem == selected ? -14 : 16)
       .offset(y: tabItem == selected ? -15 : 0)
       .onTapGesture {
           withAnimation(.spring()) {
               selected = tabItem //Tippen Sie auf, um sich selbst auszuwählen.
           }
       }
}

Es sieht aus wie das. Sie sehen jetzt den Auswahlstatus auf einen Blick. 002.gif

Einstellung der Hintergrundfarbe und Anpassung der Tab-Platzierung

Passen Sie das Erscheinungsbild von "ContentView" an.

var body: some View {
    
    ZStack {
        
        //Hintergrundfarbe.
        Color("bg").ignoresSafeArea()
        
        VStack {
            
            Spacer(minLength: 0)
            
            //Tab-Ansichtsteil.
            HStack {
                ForEach(TabItem.allCases, id: \.self) { tabItem in
                    TabItemView(tabItem: tabItem, selected: $selected)
                }
            }
            .padding(.vertical, 10.0)
            .padding(.horizontal, 20.0)
            .background(Color.white.clipShape(Capsule()))
            .shadow(color: Color.black.opacity(0.3), radius: 5, x: -5, y: 5)
        }
    }
}

Es sieht aus wie das. Es wird immer mehr so. 003.gif

Wechseln Sie die Bildschirme mit Registerkarten

Da wir eine Registerkarte vorbereitet haben, wechseln wir den Bildschirm in Verbindung mit dieser Registerkarte.

Bereiten Sie zuerst das Bildschirmteil mit einem Dummy vor. Es ist geeignet, also denke ich, dass Sie es machen können, wie Sie möchten.

struct HomeView: View {
    var body: some View {
        Text("Home")
            .font(.largeTitle)
            .fontWeight(.heavy)
            .foregroundColor(.red)
    }
}

struct ListView: View {
    var body: some View {
        Text("List")
            .font(.largeTitle)
            .fontWeight(.heavy)
            .foregroundColor(.green)
    }
}

struct SearchView: View {
    var body: some View {
        Text("Search")
            .font(.largeTitle)
            .fontWeight(.heavy)
            .foregroundColor(.blue)
    }
}

struct SettingView: View {
    var body: some View {
        Text("Setting")
            .font(.largeTitle)
            .fontWeight(.heavy)
            .foregroundColor(.yellow)
    }
}

Definieren Sie diese Ansichten schließlich mit "TabView", um mit benutzerdefinierten Registerkarten zu arbeiten.

ZStack {
    
    //Hintergrundfarbe.
    Color("bg").ignoresSafeArea()
    
    //Der Hauptbildschirmteil wird von TabView definiert.
    TabView(selection: $selected) {
        HomeView()
            .tag(TabItem.piyo)
        ListView()
            .tag(TabItem.pen)
        SearchView()
            .tag(TabItem.neko)
        SettingView()
            .tag(TabItem.tobipen)
    }
    //Verwenden Sie den PageTab-Stil(Anzeige ist ausgeblendet).
    .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
    
    VStack {
        //Kürzung.
    }
}

Zusammenfassung

Ich habe den Eindruck, dass die Definition von Registerkarten recht einfach ist, aber ich bin froh, dass es noch einfacher ist, eine "Benutzeroberfläche zum Wechseln" zu erstellen. Es scheint, dass dasselbe mit der von [diesem Artikel] erstellten Umschaltansicht (https://qiita.com/hoshi005/items/83cafdc3270bd0e248c0) getan werden kann. Bitte versuchen Sie es, wenn Sie möchten.

Recommended Posts

Erstellen Sie mit SwiftUI 2.0 eine benutzerdefinierte Registerkartenansicht
[Kotlin / Android] Erstellen Sie eine benutzerdefinierte Ansicht
Lassen Sie uns mit Java ein supereinfaches Webframework erstellen
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [3. Registerkarte "Creative hinzufügen"]
Erstellen Sie eine Datenbank in einer Produktionsumgebung
Erstellen Sie eine neue App mit Rails
Erstellen Sie ein Servlet-Programm in Eclipse
Lassen Sie uns eine TODO-App in Java 4 erstellen. Implementierung der Buchungsfunktion
Lassen Sie uns eine TODO-App in Java 6 erstellen. Implementierung der Suchfunktion
Lassen Sie uns eine TODO-App in Java 8 erstellen. Implementierung von Bearbeitungsfunktionen
Erstellen wir eine TODO-Anwendung mit Java 1 Kurze Erläuterung von MVC
Lassen Sie uns eine TODO-App in Java 5 erstellen. Schalten Sie die Anzeige von TODO um
Lassen Sie uns eine Java-Entwicklungsumgebung erstellen (Aktualisierung)
Erstellen Sie eine TODO-App in Java 7 Create Header
Docker Compact Manual (4: Erstellen eines benutzerdefinierten Bildes)
Erstellen wir eine vielseitige Dateispeicher (?) - Operationsbibliothek, indem wir die Dateispeicherung / -erfassung mit Java abstrahieren
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Erstellen wir eine REST-API mit WildFly Swarm.
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
Erstellen Sie in Eclipse ein einfaches Stapelverarbeitungsframework.
Versuchen Sie, ein Bulletin Board in Java zu erstellen
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [Einführung]
So erstellen Sie ein Thema in Liferay 7 / DXP
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Einführung]
Erstellen Sie in Salesforce ein Tool zur Namensidentifizierung
So erstellen Sie einfach ein Pulldown mit Rails
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [99. Mod-Ausgabe]
Richten Sie einen Webhook in der benutzerdefinierten App von Shopify ein
Lass uns JUnit machen.
Erstellen wir eine TODO-Anwendung mit Java 11-Ausnahmebehandlung, wenn Sie mit einer nicht vorhandenen ID auf TODO zugreifen
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [0. Basisdatei]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [4. Tools hinzufügen]
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
[Java] Lass uns einen Minecraft Mod 1.14.4 erstellen [5. Rüstung hinzufügen]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [Extra Edition]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [7. Fortschritt hinzufügen]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [6. Rezept hinzufügen]
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Element hinzufügen]
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Basisdatei]
Wenn es einen Statusübergang gibt, erstellen wir eine Statusklasse
Erstellen Sie eine gcloud-Entwicklungsumgebung auf einem centos8-Container
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [1. Element hinzufügen]
So erstellen Sie einen Daten-URI (base64) in Java
[Vollständige Programmierung] §5 Erstellen Sie eine Überprüfungsverwaltungs-App in Ruby
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [2. Fügen Sie einen Block hinzu]
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
Erstellen Sie in JavaFX ein rahmenloses, nicht rechteckiges Fenster ohne Taskleiste
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Block hinzufügen]