Browse Source

Add new SwiftUI demo views

onevcat 5 years ago
parent
commit
a2d0c6dfbd

+ 51 - 0
Demo/Demo/Kingfisher-Demo/SwiftUIViews/GridDemo.swift

@@ -0,0 +1,51 @@
+//
+//  GridDemo.swift
+//  Kingfisher
+//
+//  Created by onevcat on 2021/03/02.
+//
+//  Copyright (c) 2021 Wei Wang <onevcat@gmail.com>
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+
+import SwiftUI
+
+@available(iOS 14.0, *)
+struct GridDemo: View {
+
+    let columns = [
+        GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())
+    ]
+    var body: some View {
+        ScrollView {
+            LazyVGrid(columns: columns) {
+                ForEach(1..<700) { i in
+                    ImageCell(index: i)
+                }
+            }
+        }
+    }
+}
+
+@available(iOS 14.0, *)
+struct GridDemo_Previews: PreviewProvider {
+    static var previews: some View {
+        GridDemo()
+    }
+}

+ 47 - 0
Demo/Demo/Kingfisher-Demo/SwiftUIViews/LazyVStackDemo.swift

@@ -0,0 +1,47 @@
+//
+//  LazyVStackDemo.swift
+//  Kingfisher
+//
+//  Created by onevcat on 2021/03/02.
+//
+//  Copyright (c) 2021 Wei Wang <onevcat@gmail.com>
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+
+import SwiftUI
+
+@available(iOS 14.0, *)
+struct LazyVStackDemo: View {
+    var body: some View {
+        ScrollView {
+            LazyVStack {
+                ForEach(1..<700) { i in
+                    ImageCell(index: i).frame(width: 300, height: 300)
+                }
+            }
+        }.navigationBarTitle(Text("Lazy Stack"), displayMode: .inline)
+    }
+}
+
+@available(iOS 14.0, *)
+struct LazyVStackDemo_Previews: PreviewProvider {
+    static var previews: some View {
+        LazyVStackDemo()
+    }
+}

+ 96 - 0
Demo/Demo/Kingfisher-Demo/SwiftUIViews/ListDemo.swift

@@ -0,0 +1,96 @@
+//
+//  ListDemo.swift
+//  Kingfisher
+//
+//  Created by Wei Wang on 2019/06/18.
+//
+//  Copyright (c) 2019 Wei Wang <onevcat@gmail.com>
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+
+import Kingfisher
+import SwiftUI
+
+@available(iOS 13.0, *)
+struct ListDemo : View {
+
+    let index = 1 ..< 700
+
+    var body: some View {
+        List(index) { i in
+            ImageCell(index: i).frame(width: 300, height: 300)
+        }.navigationBarTitle(Text("SwiftUI List"), displayMode: .inline)
+    }
+}
+
+@available(iOS 13.0, *)
+struct ImageCell: View {
+
+    @State var done = false
+
+    var alreadyCached: Bool {
+        ImageCache.default.isCached(forKey: url.absoluteString)
+    }
+
+    let index: Int
+    var url: URL {
+        URL(string: "https://github.com/onevcat/Flower-Data-Set/raw/master/rose/rose-\(index).jpg")!
+    }
+
+    var body: some View {
+        HStack(alignment: .center) {
+            Spacer()
+            KFImage.url(url, isLoaded: $done)
+                .resizable()
+                .onSuccess { r in
+                    print("Success: \(self.index) - \(r.cacheType)")
+                }
+                .onFailure { e in
+                    print("Error \(self.index): \(e)")
+                }
+                .onProgress { downloaded, total in
+                    print("\(downloaded) / \(total))")
+                }
+                .placeholder {
+                    HStack {
+                        Image(systemName: "arrow.2.circlepath.circle")
+                            .resizable()
+                            .frame(width: 50, height: 50)
+                            .padding(10)
+                        Text("Loading...").font(.title)
+                    }
+                    .foregroundColor(.gray)
+                }
+                .fade(duration: 1)
+                .cancelOnDisappear(true)
+                .aspectRatio(contentMode: .fit)
+                .cornerRadius(20)
+
+            Spacer()
+        }.padding(.vertical, 12)
+    }
+
+}
+
+@available(iOS 13.0, *)
+struct SwiftUIList_Previews : PreviewProvider {
+    static var previews: some View {
+        ListDemo()
+    }
+}

+ 7 - 2
Demo/Demo/Kingfisher-Demo/SwiftUIViews/MainView.swift

@@ -40,8 +40,13 @@ struct MainView: View {
                     Text("Clear Cache").foregroundColor(.blue)
                 }
             )
-            NavigationLink(destination: SwiftUIView()) { Text("Basic Image") }
-            NavigationLink(destination: SwiftUIList()) { Text("List") }
+            NavigationLink(destination: SingleViewDemo()) { Text("Basic Image") }
+            NavigationLink(destination: SizingAnimationDemo()) { Text("Sizing Toggle") }
+            NavigationLink(destination: ListDemo()) { Text("List") }
+            if #available(iOS 14.0, *) {
+                NavigationLink(destination: LazyVStackDemo()) { Text("Stack") }
+                NavigationLink(destination: GridDemo()) { Text("Grid") }
+            }
         }.navigationBarTitle(Text("SwiftUI Sample"))
     }
 }

+ 5 - 4
Demo/Demo/Kingfisher-Demo/SwiftUIViews/SwiftUIView.swift → Demo/Demo/Kingfisher-Demo/SwiftUIViews/SingleViewDemo.swift

@@ -1,5 +1,5 @@
 //
-//  SwiftUIView.swift
+//  SingleViewDemo.swift
 //  Kingfisher
 //
 //  Created by Wei Wang on 2019/06/18.
@@ -28,7 +28,7 @@ import Kingfisher
 import SwiftUI
 
 @available(iOS 13.0, *)
-struct SwiftUIView : View {
+struct SingleViewDemo : View {
 
     @State private var index = 1
 
@@ -59,6 +59,7 @@ struct SwiftUIView : View {
                 .frame(width: 300, height: 300)
                 .cornerRadius(20)
                 .shadow(radius: 5)
+                .frame(width: 320, height: 320)
 
             Button(action: {
                 self.index = (self.index % 10) + 1
@@ -72,8 +73,8 @@ struct SwiftUIView : View {
 }
 
 @available(iOS 13.0, *)
-struct SwiftUIView_Previews : PreviewProvider {
+struct SingleViewDemo_Previews : PreviewProvider {
     static var previews: some View {
-        SwiftUIView()
+        SingleViewDemo()
     }
 }

+ 69 - 0
Demo/Demo/Kingfisher-Demo/SwiftUIViews/SizingAnimationDemo.swift

@@ -0,0 +1,69 @@
+//
+//  SizingAnimationDemo.swift
+//  Kingfisher
+//
+//  Created by onevcat on 2021/03/02.
+//
+//  Copyright (c) 2021 Wei Wang <onevcat@gmail.com>
+//
+//  Permission is hereby granted, free of charge, to any person obtaining a copy
+//  of this software and associated documentation files (the "Software"), to deal
+//  in the Software without restriction, including without limitation the rights
+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+//  copies of the Software, and to permit persons to whom the Software is
+//  furnished to do so, subject to the following conditions:
+//
+//  The above copyright notice and this permission notice shall be included in
+//  all copies or substantial portions of the Software.
+//
+//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+//  THE SOFTWARE.
+
+import SwiftUI
+import Kingfisher
+
+@available(iOS 13.0, *)
+struct SizingAnimationDemo: View {
+    @State var imageSize: CGFloat = 250
+    @State var isPlaying = false
+
+    var body: some View {
+        VStack {
+            KFImage(URL(string: "https://raw.githubusercontent.com/onevcat/Kingfisher-TestImages/master/DemoAppImage/Loading/kingfisher-1.jpg")!)
+                .resizable()
+                .aspectRatio(contentMode: .fill)
+                .frame(width: imageSize, height: imageSize)
+                .clipShape(RoundedRectangle(cornerRadius: isPlaying ? 0 : 50, style: .continuous))
+                .frame(width: 350, height: 350)
+            Button(action: {
+                playButtonAction()
+            }) {
+                Image(systemName: self.isPlaying ? "pause.fill" : "play.fill")
+                    .font(.system(size: 60))
+            }
+        }
+
+    }
+    func playButtonAction() {
+        withAnimation(Animation.spring(response: 0.45, dampingFraction: 0.475, blendDuration: 0)) {
+            if self.imageSize == 250 {
+                self.imageSize = 350
+            } else {
+                self.imageSize = 250
+            }
+            self.isPlaying.toggle()
+        }
+    }
+}
+
+@available(iOS 13.0, *)
+struct SizingAnimationDemo_Previews: PreviewProvider {
+    static var previews: some View {
+        SizingAnimationDemo()
+    }
+}

+ 0 - 96
Demo/Demo/Kingfisher-Demo/SwiftUIViews/SwiftUIList.swift

@@ -1,96 +0,0 @@
-//
-//  SwiftUIList.swift
-//  Kingfisher
-//
-//  Created by Wei Wang on 2019/06/18.
-//
-//  Copyright (c) 2019 Wei Wang <onevcat@gmail.com>
-//
-//  Permission is hereby granted, free of charge, to any person obtaining a copy
-//  of this software and associated documentation files (the "Software"), to deal
-//  in the Software without restriction, including without limitation the rights
-//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-//  copies of the Software, and to permit persons to whom the Software is
-//  furnished to do so, subject to the following conditions:
-//
-//  The above copyright notice and this permission notice shall be included in
-//  all copies or substantial portions of the Software.
-//
-//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-//  THE SOFTWARE.
-
-import Kingfisher
-import SwiftUI
-
-@available(iOS 13.0, *)
-struct SwiftUIList : View {
-
-    let index = 1 ..< 700
-
-    var body: some View {
-        List(index) { i in
-            ListCell(index: i)
-        }.navigationBarTitle(Text("SwiftUI List"), displayMode: .inline)
-    }
-
-    struct ListCell: View {
-
-        @State var done = false
-
-        var alreadyCached: Bool {
-            ImageCache.default.isCached(forKey: url.absoluteString)
-        }
-
-        let index: Int
-        var url: URL {
-            URL(string: "https://github.com/onevcat/Flower-Data-Set/raw/master/rose/rose-\(index).jpg")!
-        }
-
-        var body: some View {
-            HStack(alignment: .center) {
-                Spacer()
-                KFImage.url(url, isLoaded: $done)
-                    .resizable()
-                    .onSuccess { r in
-                        print("Success: \(self.index) - \(r.cacheType)")
-                    }
-                    .onFailure { e in
-                        print("Error \(self.index): \(e)")
-                    }
-                    .onProgress { downloaded, total in
-                        print("\(downloaded) / \(total))")
-                    }
-                    .placeholder {
-                        HStack {
-                            Image(systemName: "arrow.2.circlepath.circle")
-                                .resizable()
-                                .frame(width: 50, height: 50)
-                                .padding(10)
-                            Text("Loading...").font(.title)
-                        }
-                        .foregroundColor(.gray)
-                    }
-                    .fade(duration: 1)
-                    .cancelOnDisappear(true)
-                    .aspectRatio(contentMode: .fit)
-                    .cornerRadius(20)
-                    .frame(width: 300, height: 300)
-
-                Spacer()
-            }.padding(.vertical, 12)
-        }
-
-    }
-}
-
-@available(iOS 13.0, *)
-struct SwiftUIList_Previews : PreviewProvider {
-    static var previews: some View {
-        SwiftUIList()
-    }
-}

+ 20 - 8
Demo/Kingfisher-Demo.xcodeproj/project.pbxproj

@@ -44,6 +44,9 @@
 		D12EB84024DDB9E100329EE1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D12EB83F24DDB9E000329EE1 /* LaunchScreen.storyboard */; };
 		D1679A461C4E78B20020FD12 /* Kingfisher-watchOS-Demo Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D1679A451C4E78B20020FD12 /* Kingfisher-watchOS-Demo Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		D16CC3D824E03FEA00F1A515 /* AVAssetImageGeneratorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16CC3D724E03FEA00F1A515 /* AVAssetImageGeneratorViewController.swift */; };
+		D198F41E25EDC11500C53E0D /* LazyVStackDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D198F41D25EDC11500C53E0D /* LazyVStackDemo.swift */; };
+		D198F42025EDC34000C53E0D /* SizingAnimationDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D198F41F25EDC34000C53E0D /* SizingAnimationDemo.swift */; };
+		D198F42225EDC4B900C53E0D /* GridDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D198F42125EDC4B900C53E0D /* GridDemo.swift */; };
 		D1A1CCA321A1879600263AD8 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1CCA221A1879600263AD8 /* MainViewController.swift */; };
 		D1A1CCA721A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1CCA621A18A3200263AD8 /* UIViewController+KingfisherOperation.swift */; };
 		D1A1CCA821A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A1CCA621A18A3200263AD8 /* UIViewController+KingfisherOperation.swift */; };
@@ -56,9 +59,9 @@
 		D1F06F3721AAEACF000B1C38 /* GIFViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F06F3621AAEACF000B1C38 /* GIFViewController.swift */; };
 		D1F06F3921AAF1EE000B1C38 /* IndicatorCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F06F3821AAF1EE000B1C38 /* IndicatorCollectionViewController.swift */; };
 		D1F78A5F2589F0AA00930759 /* SwiftUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A5E2589F0AA00930759 /* SwiftUIViewController.swift */; };
-		D1F78A642589F17200930759 /* SwiftUIList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A612589F17200930759 /* SwiftUIList.swift */; };
+		D1F78A642589F17200930759 /* ListDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A612589F17200930759 /* ListDemo.swift */; };
 		D1F78A652589F17200930759 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A622589F17200930759 /* MainView.swift */; };
-		D1F78A662589F17200930759 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A632589F17200930759 /* SwiftUIView.swift */; };
+		D1F78A662589F17200930759 /* SingleViewDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F78A632589F17200930759 /* SingleViewDemo.swift */; };
 		D1FAB06F21A853E600908910 /* HighResolutionCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1FAB06E21A853E600908910 /* HighResolutionCollectionViewController.swift */; };
 /* End PBXBuildFile section */
 
@@ -182,6 +185,9 @@
 		D1679A391C4E78B20020FD12 /* Kingfisher-watchOS-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Kingfisher-watchOS-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		D1679A451C4E78B20020FD12 /* Kingfisher-watchOS-Demo Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Kingfisher-watchOS-Demo Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
 		D16CC3D724E03FEA00F1A515 /* AVAssetImageGeneratorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVAssetImageGeneratorViewController.swift; sourceTree = "<group>"; };
+		D198F41D25EDC11500C53E0D /* LazyVStackDemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyVStackDemo.swift; sourceTree = "<group>"; };
+		D198F41F25EDC34000C53E0D /* SizingAnimationDemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizingAnimationDemo.swift; sourceTree = "<group>"; };
+		D198F42125EDC4B900C53E0D /* GridDemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridDemo.swift; sourceTree = "<group>"; };
 		D1A1CCA221A1879600263AD8 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
 		D1A1CCA621A18A3200263AD8 /* UIViewController+KingfisherOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+KingfisherOperation.swift"; sourceTree = "<group>"; };
 		D1CE1BCF21A1AFA300419000 /* TransitionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransitionViewController.swift; sourceTree = "<group>"; };
@@ -192,9 +198,9 @@
 		D1F06F3621AAEACF000B1C38 /* GIFViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GIFViewController.swift; sourceTree = "<group>"; };
 		D1F06F3821AAF1EE000B1C38 /* IndicatorCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndicatorCollectionViewController.swift; sourceTree = "<group>"; };
 		D1F78A5E2589F0AA00930759 /* SwiftUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIViewController.swift; sourceTree = "<group>"; };
-		D1F78A612589F17200930759 /* SwiftUIList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftUIList.swift; sourceTree = "<group>"; };
+		D1F78A612589F17200930759 /* ListDemo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListDemo.swift; sourceTree = "<group>"; };
 		D1F78A622589F17200930759 /* MainView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
-		D1F78A632589F17200930759 /* SwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = "<group>"; };
+		D1F78A632589F17200930759 /* SingleViewDemo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleViewDemo.swift; sourceTree = "<group>"; };
 		D1FAB06E21A853E600908910 /* HighResolutionCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighResolutionCollectionViewController.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -397,8 +403,11 @@
 			isa = PBXGroup;
 			children = (
 				D1F78A622589F17200930759 /* MainView.swift */,
-				D1F78A612589F17200930759 /* SwiftUIList.swift */,
-				D1F78A632589F17200930759 /* SwiftUIView.swift */,
+				D1F78A612589F17200930759 /* ListDemo.swift */,
+				D198F42125EDC4B900C53E0D /* GridDemo.swift */,
+				D1F78A632589F17200930759 /* SingleViewDemo.swift */,
+				D198F41D25EDC11500C53E0D /* LazyVStackDemo.swift */,
+				D198F41F25EDC34000C53E0D /* SizingAnimationDemo.swift */,
 			);
 			path = SwiftUIViews;
 			sourceTree = "<group>";
@@ -651,16 +660,19 @@
 				D1CE1BD021A1AFA300419000 /* TransitionViewController.swift in Sources */,
 				D10AC99821A300C9005F057C /* ProcessorCollectionViewController.swift in Sources */,
 				D1F06F3921AAF1EE000B1C38 /* IndicatorCollectionViewController.swift in Sources */,
-				D1F78A662589F17200930759 /* SwiftUIView.swift in Sources */,
+				D1F78A662589F17200930759 /* SingleViewDemo.swift in Sources */,
 				D12E0C981C47F91800AC98AD /* ImageCollectionViewCell.swift in Sources */,
+				D198F42025EDC34000C53E0D /* SizingAnimationDemo.swift in Sources */,
 				D1A1CCA721A18A3200263AD8 /* UIViewController+KingfisherOperation.swift in Sources */,
-				D1F78A642589F17200930759 /* SwiftUIList.swift in Sources */,
+				D1F78A642589F17200930759 /* ListDemo.swift in Sources */,
+				D198F41E25EDC11500C53E0D /* LazyVStackDemo.swift in Sources */,
 				D1E4CF5421BACBA6004D029D /* ImageDataProviderCollectionViewController.swift in Sources */,
 				D1FAB06F21A853E600908910 /* HighResolutionCollectionViewController.swift in Sources */,
 				D1F78A652589F17200930759 /* MainView.swift in Sources */,
 				D1F78A5F2589F0AA00930759 /* SwiftUIViewController.swift in Sources */,
 				D12E0C951C47F91800AC98AD /* AppDelegate.swift in Sources */,
 				D1F06F3321AA4292000B1C38 /* DetailImageViewController.swift in Sources */,
+				D198F42225EDC4B900C53E0D /* GridDemo.swift in Sources */,
 				4B1C7A3D21A256E300CE9D31 /* InfinityCollectionViewController.swift in Sources */,
 				D1A1CCA321A1879600263AD8 /* MainViewController.swift in Sources */,
 				D1F06F3721AAEACF000B1C38 /* GIFViewController.swift in Sources */,