Créer un onglet personnalisé avec SwiftUI 2.0

API ajoutée dans Swift UI 2.0

Je voulais utiliser le PageTabViewStyle ajouté dans SwiftUI 2.0, j'ai donc créé quelque chose comme un onglet personnalisé.

Formulaire rempli pour le moment

J'aimerais faire quelque chose comme ça. 999.gif GitHub est là. https://github.com/hoshi005/custom-tab

Environnement de développement

Préparation préalable

Créer un onglet

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

Puisque le fichier gif d'animation a été nommé et placé comme ceci, enum est défini en faisant correspondre les noms.

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

J'ai ajouté un TabItemView pour représenter chaque onglet et je l'ai défini comme suit.

struct TabItemView: View {
    
    let tabItem: TabItem
    @Binding var selected: TabItem
    
    var body: some View {
        //Importation SDWebImageSwiftUI requise.
        AnimatedImage(name: tabItem.name)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 40)
            .onTapGesture {
                selected = tabItem //Appuyez pour vous sélectionner.
            }
    }
}

Dans le ContentView principal, la vue de l'onglet est définie comme suit.

struct ContentView: View {
    
    //Sélection d'onglets et valeurs initiales.
    @State private var selected: TabItem = .piyo
    
    var body: some View {
        
        //Partie vue onglet.
        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)
    }
}

Voici le produit fini. À ce rythme, vous ne comprenez pas vraiment l'état de la sélection. 001.gif

Ajustez l'apparence de sorte que vous puissiez voir l'état sélectionné

Réécrivez TabItemView comme suit pour changer l'apparence lorsqu'il est sélectionné / non sélectionné.

var body: some View {
   AnimatedImage(name: tabItem.name)
       .resizable()
       .aspectRatio(contentMode: .fit)
       //Ajustez la taille et l'espacement en fonction de l'état de la sélection.
       .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 //Appuyez pour vous sélectionner.
           }
       }
}

Ça ressemble à ça. Vous pouvez maintenant voir l'état de la sélection en un coup d'œil. 002.gif

Réglage de la couleur d'arrière-plan et ajustement du placement des onglets

Ajustez l'apparence de «ContentView».

var body: some View {
    
    ZStack {
        
        //Couleur de l'arrière plan.
        Color("bg").ignoresSafeArea()
        
        VStack {
            
            Spacer(minLength: 0)
            
            //Partie vue onglet.
            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)
        }
    }
}

Ça ressemble à ça. Cela devient de plus en plus comme ça. 003.gif

Changer d'écran avec des onglets

Puisque nous avons préparé un onglet, nous changerons l'écran en conjonction avec cet onglet.

Tout d'abord, préparez la partie écran avec un mannequin. C'est approprié, donc je pense que vous pouvez le faire comme vous le souhaitez.

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)
    }
}

Enfin, définissez ces vues avec TabView pour travailler avec des onglets personnalisés.

ZStack {
    
    //Couleur de l'arrière plan.
    Color("bg").ignoresSafeArea()
    
    //La partie principale de l'écran est définie par TabView.
    TabView(selection: $selected) {
        HomeView()
            .tag(TabItem.piyo)
        ListView()
            .tag(TabItem.pen)
        SearchView()
            .tag(TabItem.neko)
        SettingView()
            .tag(TabItem.tobipen)
    }
    //Utiliser le style PageTab(L'indicateur est masqué).
    .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
    
    VStack {
        //réduction.
    }
}

Sommaire

J'ai l'impression que la définition des onglets est assez simple, mais je suis content qu'il soit encore plus facile de créer une "UI pour changer". Il semble que la même chose puisse être faite avec la vue de commutation créée par cet article. Veuillez l'essayer si vous le souhaitez.

Recommended Posts

Créer un onglet personnalisé avec SwiftUI 2.0
[Kotlin / Android] Créer une vue personnalisée
Créons un framework Web ultra-simple avec Java
[Java] Créons un Minecraft Mod 1.14.4 [3. Ajouter un onglet de création]
Créer une base de données dans un environnement de production
Créer une nouvelle application avec Rails
Créer un programme Servlet dans Eclipse
Créons une application TODO en Java 4 Implémentation de la fonction de publication
Créons une application TODO en Java 6 Implémentation de la fonction de recherche
Créons une application TODO en Java 8 Implémentation des fonctions d'édition
Créons une application TODO avec Java 1 Brève explication de MVC
Créons une application TODO en Java 5 Changer l'affichage de TODO
Créons un environnement de développement Java (mise à jour)
Créer une application TODO dans Java 7 Créer un en-tête
Manuel Docker Compact (4: Créer une image personnalisée)
Créons une bibliothèque d'opérations de stockage de fichiers polyvalente (?) En faisant abstraction du stockage / acquisition de fichiers avec Java
Créer un CSR avec des informations étendues en Java
Créons une API REST à l'aide de WildFly Swarm.
Créons un processus chronométré avec la minuterie de Java! !!
Créez un cadre de traitement par lots simple dans Eclipse.
Essayez de créer un babillard en Java
[Java] Créons un Minecraft Mod 1.14.4 [Introduction]
Comment créer un thème dans Liferay 7 / DXP
[Java] Créons un Minecraft Mod 1.16.1 [Introduction]
Créer un outil pour l'identification des noms dans Salesforce
Comment créer facilement un pull-down avec des rails
[Java] Créons un Minecraft Mod 1.14.4 [99. Mod output]
Configurer un webhook dans l'application personnalisée de Shopify
Faisons JUnit.
Créons une application TODO en Java 11 Gestion des exceptions lors de l'accès à un TODO avec un ID inexistant
[Java] Créons un Minecraft Mod 1.14.4 [0. Fichier de base]
[Java] Créons un Minecraft Mod 1.14.4 [4. Ajouter des outils]
Comment créer un environnement Java en seulement 3 secondes
[Java] Créons un Minecraft Mod 1.14.4 [5. Ajouter une armure]
[Java] Créons un Minecraft Mod 1.14.4 [édition supplémentaire]
[Java] Créons un Minecraft Mod 1.14.4 [7. Add progress]
[Java] Créons un Minecraft Mod 1.14.4 [6. Ajouter une recette]
[Java] Créons un Minecraft Mod 1.16.1 [Ajouter un élément]
Comment créer un projet Spring Boot dans IntelliJ
[Java] Créons un Minecraft Mod 1.16.1 [Fichier de base]
S'il y a une transition d'état, créons une classe State
Créer un environnement de développement gcloud sur un conteneur centos8
J'ai essayé de créer une compétence Clova en Java
[Java] Créons un Minecraft Mod 1.14.4 [1. Ajouter un élément]
Comment créer un URI de données (base64) en Java
[Programmation complète] §5 Créer une application de gestion des avis dans Ruby
[Java] Créons un Minecraft Mod 1.14.4 [2. Ajouter un bloc]
[Rails] Comment charger JavaScript dans une vue spécifique
Créer une fenêtre non rectangulaire sans cadre sans barre de tâches dans JavaFX
[Java] Créons un Minecraft Mod 1.16.1 [Ajouter un bloc]