SwiftUI初探

      SwiftUI 虽然出现了好几年(1.0好像2019年出的,还有SPM也是同一年),现在已经到从1.0到5.0,但受限于对系统的要求(最低iOS13.0,有的要求17.0及以上),每个版本里面差异也很大,语法和Flutter 的Dart 比较像。空闲之余可以先学习下,给有需要的同学做个参考, 官方也有现成案例,展示效果如图:

地标列表:

import SwiftUI


/// 列表
struct LandmarkList : View {
    
    @Environment(ModelData.self) var modelData
    
    /// 仅展示收藏
    @State private var showFavoritesOnly = false
    
    /// 数据过滤
    private var filterLandmarks:[Landmark] {
        modelData.landmarkData.filter { $0.isFavorite == true || !showFavoritesOnly }
    }
    
    /// 转场设置
    @State private var selectIndex:Int = 0
    @State private var _index:Int? = nil
    
    var body: some View {
        NavigationView {
            List{
                Toggle(isOn: $showFavoritesOnly, label: {
                    Text("Favorites Only")
                })
                
                if selectIndex == 0 {
                    ForEach(filterLandmarks) { landmark in
                        NavigationLink {
                            LandMarkDetail(landmark: landmark)
                        } label: {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
                else{
                    ForEach(filterLandmarks.indices,id:\.self) { index in
                        LandmarkRow(landmark: filterLandmarks[index])
                            .onTapGesture {
                                _index = index
                                debugPrint("onTapGesture:{\(index),\(String(describing: _index))}")
                            }
                    }
                    .sheet(isPresented: .constant(selectIndex > 0 && _index != nil),
                           onDismiss: {
                        _index = nil
                    },
                           content: {
                        if _index != nil && filterLandmarks.count > _index! {
                            LandMarkDetail(landmark: filterLandmarks[_index!])
                        }
                    })
                }
            }
            .navigationBarTitle("Landmarks", displayMode: .large)
            .navigationBarItems(trailing: SegmentButton(selectIndex:$selectIndex))
            .animation(.easeInOut, value: 0.5)
        }
    }
}

#Preview {
    let modelData = ModelData()
    return LandmarkList()
        .environment(modelData)
}

详情:

import SwiftUI


struct LandMarkDetail : View {
    
    @Environment(ModelData.self) var modelData
    var landmark : Landmark
    var landmarkIndex:Int? {
        get{
            modelData.landmarkData.firstIndex { $0.id == landmark.id }
        }
    }
    
    var body: some View {
        @Bindable var modelData = modelData
        
        ScrollView {
            MapView(coordinate: landmark.locationCoordinate).frame(height: 300)
            
            CircleImage(image: landmark.image(forSize: 250))
                .offset(y: -130)
                .padding(.bottom, -130)
            
            VStack(alignment: .leading) {
                HStack{
                    Text(landmark.name)
                        .font(.title)
                    FavoriteButton(isSet: landmarkIndex != nil ? $modelData.landmarkData[landmarkIndex!].isFavorite : .constant(false))
                }
                
                HStack {
                    Text(landmark.park)
                    Spacer()
                    Text(landmark.state)
                }
                .font(.subheadline)
                .foregroundStyle(.secondary)
                
                Divider()
                
                Text("About \(landmark.name)")
                    .font(.title2)
                Text(landmark.description ?? "")
            }
            .padding()
            Spacer()
        }
        .navigationBarTitle(landmark.name, displayMode: .inline)
        .navigationBarItems(trailing: FavoriteButton(isSet: landmarkIndex != nil ? $modelData.landmarkData[landmarkIndex!].isFavorite : .constant(false)))
    }
}

#Preview {
    let modelData = ModelData()
    return LandMarkDetail(landmark: modelData.landmarkData[0])
        .environment(modelData)
}

每天学习一小步,进步一大步,Demo示例 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追夢秋陽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值