首页 > 其他分享 >swiftui 轮播图切换

swiftui 轮播图切换

时间:2024-10-31 18:19:10浏览次数:3  
标签:轮播 self padding width swiftui 切换 var page view

import SwiftUI

struct Banner: View {
    @State var cat = 0
    @State var page = 0
    
    var body: some View {
        
        ZStack {
            
            Color.gray.edgesIgnoringSafeArea(.all)
            
            VStack {
                
                ZStack {
                    
                    HStack {
                        
                        Button {
                            
                        }label: {
                            
                            Image(systemName: "menucard")
                                .renderingMode(.original)
                                .padding()
                            
                        }
                        .background(Color.white)
                        .cornerRadius(10)
                        
                        Spacer()
                        
                        Image("cat1")
                            .resizable()
                            .frame(width: 40, height: 40)
                            .cornerRadius(12)
                        
                    }
                    .padding(.horizontal)
                    
                    Text("Cat")
                        .font(.system(size: 22))
                }
                
                HStack(spacing: 15) {
                    
                    Button {
                        self.cat = 0
                    }label: {
                        
                        Text("LinQiYe")
                            .foregroundColor(self.cat == 0 ? .white : .black)
                            .padding(.vertical, 10)
                            .padding(.horizontal, 20)
                    }
                    .background(self.cat == 0 ? Color.black : Color.white)
                    .clipShape(Capsule())
                    
                    Button {
                        self.cat = 1
                    }label: {
                        
                        Text("TuTu")
                            .foregroundColor(self.cat == 1 ? .white : .black)
                            .padding(.vertical, 10)
                            .padding(.horizontal, 20)
                    }
                    .background(self.cat == 1 ? Color.black : Color.white)
                    .clipShape(Capsule())
                    
                    Button {
                        self.cat = 2
                    }label: {
                        
                        Text("YouYou")
                            .foregroundColor(self.cat == 2 ? .white : .black)
                            .padding(.vertical, 10)
                            .padding(.horizontal, 20)
                    }
                    .background(self.cat == 2 ? Color.black : Color.white)
                    .clipShape(Capsule())
                }
                .padding(.top, 30)
                
                GeometryReader { geo in
                    //                    List()
                    Carousel(width: UIScreen.main.bounds.width, height: geo.frame(in: .global).height, page: self.$page)
                }
                
                PageControl(page: self.$page)
                    .padding(.top, 10)
            }
            .padding(.vertical)
        }
        
    }
}

struct Banner_Previews: PreviewProvider {
    static var previews: some View {
        Banner()
    }
}


struct List: View {
    @Binding var page: Int
    
    var body: some View {
        
        HStack(spacing: 0) {
            
            ForEach(data) { item in
                
                // mistakenly used Geomtry Reader
                
                CatCard(page: self.$page, width: UIScreen.main.bounds.width, data: item)
                
                
            }
        }
    }
}




struct CatCard: View {
    @Binding var page: Int
    var width: CGFloat
    var data: Type
    
    var body: some View {
        
        VStack {
            
            VStack {
                
                Text(self.data.name)
                    .font(.title)
                    .fontWeight(.bold)
                    .padding(.top)
                
                Text(self.data.cName)
                    .foregroundColor(.gray)
                    .padding(.vertical)
                
                Spacer(minLength: 0)
                
                Image(self.data.image)
                    .resizable()
                    .frame(width: self.width - (self.page == self.data.id ? 100 : 100), height:
                            (self.page == self.data.id ? 250 : 200))
                    .cornerRadius(20)
                
                Text(self.data.price)
                    .fontWeight(.bold)
                    .font(.title)
                    .padding(.top, 20)
                
                Button {
                    
                }label: {
                    
                    Text("Buy")
                        .foregroundColor(.black)
                        .padding(.vertical, 10)
                        .padding(.horizontal, 30)
                }
                .background(Color.pink)
                .clipShape(Capsule())
                .padding(.top, 20)
                
                Spacer(minLength: 0)
                // for filling empty space
            }
            .padding(.horizontal, 20)
            .padding(.vertical, 25)
            .background(Color.white)
            .cornerRadius(20)
            .padding(.top, 25)
            // increasing height and width if currnet page appears
            .padding(.vertical, self.page == data.id ? 0 : 25)
            .padding(.horizontal, self.page == data.id ? 0 : 25)
        }
        .frame(width: self.width)
        .animation(.default)
    }
}


struct Carousel: UIViewRepresentable {
    
    func makeCoordinator() -> Coordinator {
        
        return Carousel.Coordinator(parent1: self)
    }
    
    var width: CGFloat
    var height: CGFloat
    @Binding var page: Int
    
    func makeUIView(context: Context) -> UIScrollView {
        // ScrollView content size
        let total = width * CGFloat(data.count)
        let view = UIScrollView()
        view.isPagingEnabled = true
        //1.0 for disabling vertical scroll
        view.contentSize = CGSize(width: total, height: 1.0)
        view.bounces = true
        view.showsVerticalScrollIndicator = false
        view.showsHorizontalScrollIndicator = false
        view.delegate = context.coordinator
        
        // embed swiftui view into uiview
        let view1 = UIHostingController(rootView: List(page: self.$page))
        view1.view.frame = CGRect(x: 0, y: 0, width: total, height: self.height)
        view1.view?.backgroundColor = .clear
        view.addSubview(view1.view)
        return view
    }
    
    func updateUIView(_ uiView: UIScrollView, context: Context) {
        
    }
    
    class Coordinator: NSObject, UIScrollViewDelegate {
        
        var parent: Carousel
        
        init(parent1: Carousel) {
            
            parent = parent1
        }
        
        func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
            
            // using this function for getting currnet page
            
            let page = Int(scrollView.contentOffset.x / UIScreen.main.bounds.width)
            print(page)
            
            self.parent.page = page

            

        }
    }
}

// implement UIPageControl
struct PageControl: UIViewRepresentable {
    @Binding var page: Int
    
    func makeUIView(context: Context) -> UIPageControl {
        
        let view = UIPageControl()
        view.currentPageIndicatorTintColor = .black
        view.pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
        view.numberOfPages = data.count
        return view
    }
    
    func updateUIView(_ uiView: UIPageControl, context: Context) {
        
        // updating page indicator when ever page change
        DispatchQueue.main.async {

            uiView.currentPage = self.page
        }
    }
}
import SwiftUI

struct Type: Identifiable {
    
    var id: Int
    var name: String
    var cName: String
    var price: String
    var image: String
}

var data = [

    Type(id: 0, name: "cat1", cName: "LinQiYe", price: "$25", image: "cat1"),
    Type(id: 1, name: "cat2", cName: "TuTu", price: "$55", image: "cat2"),
    Type(id: 2, name: "cat3", cName: "YouYou", price: "$35", image: "cat3"),
    Type(id: 3, name: "cat4", cName: "LinQiYe", price: "$15", image: "cat4"),
    Type(id: 4, name: "cat5", cName: "YouYou", price: "$65", image: "cat5"),
]

标签:轮播,self,padding,width,swiftui,切换,var,page,view
From: https://blog.csdn.net/qq_63007445/article/details/143366416

相关文章

  • swiftui轮播图
    importSwiftUIstructPost:Identifiable{varid=UUID().uuidStringvarpostImage:String}importSwiftUIstructSnapCarousel<Content:View,T:Identifiable>:View{varcontent:(T)->Contentvarlist:[T]/......
  • 使用JavaScript实现:随机曲线之间进行平滑切换
    介绍今天,我运用拉格朗日插值法绘制了一条曲线。然而,我并未止步于静态展示,而是引入了一个定时器,每隔一段时间便对曲线上的点进行动态更新,从而赋予曲线生命般的动态变化。然而,在刷新过程中,我敏锐地察觉到曲线之间的切换显得过于突兀,缺乏流畅感(请见下图)。于是,一个大胆的想法......
  • 轻松掌握在AirtestIDE中切换为本地Python环境的详细指南
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言最近有一些新入门的小伙伴们都在问如何在AirtestIDE内使用更多的依赖库,为了解决这个问题,我们建议将AirtestIDE的Python环境切换为本地Python环境,并在本地......
  • MySQL的主从切换在什么情况下使用
    主从切换一般在如下情况下才进行:1、例行的主库重启,主库运行一段时间后需要将主库进行重启扫盘,降低主库死机的风险;2、主库异常情况下切到从库。3、分机房网络调整涉及到主库的情况。一、MySQL的主从切换在什么情况下使用主从切换一般在如下情况下才进行:1、例行的主库重启,主库......
  • 鸿蒙多语言智能输入法设计:动态切换子类型与实时翻译功能
    本文旨在深入探讨多语言智能输入法的设计与实现,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在全球化的今天,多语言智能输入法成为了人们跨语言交流的重要工......
  • 鸿蒙多语言智能输入法设计:动态切换子类型与实时翻译功能
    本文旨在深入探讨多语言智能输入法的设计与实现,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在全球化的今天,多语言智能输入法成为了人们跨语言交流的......
  • 学习笔记(十五):ArkUi-切换按钮 (Toggle)
    概述:提供状态按钮样式、勾选框样式和开关样式,一般用于两种状态之间的切换一、创建单选框接口形式如下:type为类型,支持三种1、Switch  不包含子组件Toggle({type:ToggleType.Switch,isOn:true}) 2、Checkbox不包含子组件Toggle({type:ToggleType.Checkbox,isOn:true}......
  • (系列十)Vue3中菜单和路由的结合使用,实现菜单的动态切换(附源码)
    说明  该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。   该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。   说明:OverallAuth2.0是一个简单、易懂、功能强大的权限+可视化流程管理系统。友情提醒:本篇文章是属于系......
  • 记一个mysql 主从切换的实验记录
    一、前言msyql切换主库一般都是用高可用方案,例如MHA,MGR,高可用方案可以自动切主,但是MHA的failover功能无法把旧主自动挂到新主上作为从库使用,所以发生failover后,还需要手动把旧的主库作为备库挂到新的主库上。此时常规操作就是备份新主库,然后应用到旧主库上,然后再重新搭建主从。......
  • ng-zorro走马灯carousel轮播图不自动轮播问题
    原文链接:ng-zorro走马灯carousel轮播图不自动轮播问题–每天进步一点点 angular项目(angular7),ng-zorro(7.5.x)使用carousel走马灯设置自动轮播图功能,从官网上copy下一段代码如下:<nz-carouselnzAutoPlay><divnz-carousel-content*ngFor="letindexofarray">......