38 SwiftUI

简介: SwiftUI

SwiftUI

image.png

  • SwiftUI 是一种基于Swift的强大能力,简单创新的构建用户界面的方法,并且可以运行在苹果所有的平台上

image.png

SwiftUI - 声明式语法

  • SwiftUI采用声明式语法,因为你可以简单声明你的用户界面

image.png

  • Xcode11提供了强大的设计工具,可以通过简单的拖拽用SwiftUI生成用户界面

image.png

  • 只需要描述一次的布局-为你的视图声明任何状态的内容和布局,一旦状态发生改变,SwiftUI会自动更新视图的渲染
  • 构建可复用的组件-将小型、独立视图组合到更大,更复杂的界面中。在任何为Apple平台所设计的应用之间,共享您的自定义视图
  • 精简动画-创建平滑的动画就像调用单个方法一样简单。SwiftUI会在必要时自动计算并过渡动画


SwiftUI设计工具使用指南

创建项目

image.png

Stacks

image.png

如何使用SwiftUI构建可复用的组件

地标页例子

image.png

Image组件

image.png

image.png

image.pngimage.png


structContentView: View {
varbody: someView {
VStack {
//设置安全距离MapView().edgesIgnoringSafeArea(.all)
                .frame(height: 300)
CircleImage().offset(y: -130).padding(.bottom, -130)
//左对齐VStack (alignment: .leading) {
Text("圆明园").font(.title)
HStack {
Text("皇家园林").font(.subheadline)
Spacer()
Text("北京").font(.subheadline)
                }
            }.padding()//边界留白Spacer()//留白        }
    }
}

图片组件

structCircleImage: View {
varbody: someView {
//将图片剪切出一个圆Image("ymy").clipShape(Circle())
//加一个边框线        .overlay(Circle().stroke(Color.black, lineWidth: 4))
        .shadow(radius: 10)//阴影    }
}

地图组件

importSwiftUIimportMapKitstructMapView; UIViewRepresentable {
//创建地图组件funcmakeUIView(context: Context) ->MKMapView {
returnMKMapView(frame: .zero)
    }
//对地图组件进行设置funcupdateUIView(_uiView: MKMapView, context: Context) {
//圆明园的经纬度letlocation=CLLocationCoordinate2D(latitude: 40.00491139888854, longitude: 116.2896180152893)
//展示范围letspan=MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
letregion=MKCoordinateRegion(center: location, span: span)
uiView.setRegion(region, animated: true)
    }
}

如何使用SwiftUI实现动画

SwiftUI - 动画

  • 在SwiftUI中,你可以将任意的改变过程封装进一个withAnimation块中。默认,SwiftUI会对这种改变采用fade in/out 的方式进行动画
structAnimationView: View {
//状态 当属性改变时, 会进行重写渲染@StateprivatevarshowDetail=falsevarbody: someView {
Button(action: {
withAnimation {
self.showDetail=!self.showDetail            }
        }) {
Image(systemName: "chevron.right.circle")//使用了一张系统图片                .imageScale(.large)//尺寸                .rotationEffect(.degrees(showDetail?90 : 0))//旋转90度或0度                .scaleEffect(showDeatil?1.5 : 1)//放大倍数            .padding()
        }
    }
}

在这里更改显示入口

image.png

深入理解SwiftUI:实现原理探秘

@propertyWrapper

  • 通过property Wrapper机制,对一些类似的属性的实现代码做同一封装
  • 通过@propertyWrapper可以移除掉一些重复或者类似的代码

@state

  • 通过@State SwiftUI 实现了值的绑定、动态查找和View的自动重现绘制

image.png

image.png

  • 课后题:查看源码,了解@Binding,@ObservedObject,@EnvironmentObject等装饰器的作用
extensionUserDefaults {
publicenumKeys {
staticlethadShownUserGuide="hadShownUserGuide"    }
varhadShownUserGuide: Bool {
set {
set(newValue, forKey: Keys.hadShownUserGuide)
        }
get {
bool(forKey: Keys.hadShownUserGuide)
        }
    }
}
structPropertyWrapperView: View {
@StateprivatevarshowText=UserDefaults.standard.hasShownUserGuide?"已经展示" : "没有展示过"varbody: someView {
Button(action: {
if (!UserDefaults.standard.hasShownUserGuide) {
UserDefaults.standard.hasShownUserGuide=trueself.showText="已经展示"            }
        }) {
Text(self.showText)
        }
    }
}
  • 使用propertyWrapper进行统一扩展
@propertyWrapperstructUserDefaultsWrapper<T> {
varkey: StringvardefaultValue : Tinit(_key: String, defaultValue: T) {
self.key=keyself.defaultValue=defaultValue    }
varwrappedValue: T {
get {
returnUserDefaults.standard.value(forKey: key) as?T??defaultValue        }
set {
UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}
structPropertyWrapperView: View {
@UserDefaultsWrapper("hadShownUserGuide", defaultValue: false)
staticvarhadShownUserGuide : Bool@StateprivatevarshowText=PropertyWrapperView.hasShownUserGuide?"已经展示" : "没有展示过"varbody: someView {
Button(action: {
if (!PropertyWrapperView.hasShownUserGuide) {
PropertyWrapperView.hasShownUserGuide=trueself.showText="已经展示"            }
        }) {
Text(self.showText)
        }
    }
}








目录
相关文章
|
存储 安全 编译器
内存对齐:C/C++编程中的重要性和技巧
内存对齐:C/C++编程中的重要性和技巧
650 1
|
机器学习/深度学习 数据采集 算法
深入了解机器学习:从入门到应用
【10月更文挑战第6天】深入了解机器学习:从入门到应用
|
10月前
|
存储 测试技术 Python
Python 中别再用 ‘+‘ 拼接字符串了!
通过选择合适的字符串拼接方法,可以显著提升 Python 代码的效率和可读性。在实际开发中,根据具体需求和场景选择最佳的方法,避免不必要的性能损失。
194 5
|
JSON 安全 API
构建高效后端API:最佳实践与代码示例
【8月更文挑战第2天】 在数字化时代,后端API是连接数据与用户的桥梁。本文深入探讨了如何设计并实现高效的后端API,从理论到实践,提供了实用的技巧和代码示例。通过阅读本篇文章,你将学会如何避免常见的陷阱,优化你的API性能,从而提供更加流畅的用户体验。
|
11月前
|
运维 Devops
自动化运维:从脚本到DevOps的进化之旅
在数字化时代,自动化运维不仅是提高生产效率的关键,更是企业竞争力的象征。本文将带领读者穿越自动化运维的发展历程,从最初的脚本编写到现代DevOps文化的形成,揭示这一演变如何重塑IT行业的工作模式。通过具体案例,我们将展示自动化工具和实践如何简化复杂任务,优化流程,并促进团队协作。你将发现,自动化运维不仅关乎技术的进步,更体现了人、流程和技术三者之间协同增效的深层逻辑。
|
存储 C语言
C enum(枚举)详解
在C语言中,`enum`(枚举类型)允许用户定义包含命名整数常量的数据类型,提高了代码的可读性和可维护性。通过关键字`enum`定义枚举,如`enum Color {RED, GREEN, BLUE}`。枚举值默认从0开始递增,也可自定义。枚举类型实际上是整型的别名,可用于简化代码并限制变量的具体取值范围。
594 15
|
缓存 负载均衡 安全
如何应对DDoS攻击:技术策略与实践
【8月更文挑战第20天】DDoS攻击作为一种常见的网络威胁,对信息系统的安全稳定运行构成了严峻挑战。通过采用流量清洗、CDN、负载均衡、防火墙与IPS、协议与连接限制、强化网络基础设施、实时监测与响应以及专业DDoS防护服务等策略,企业可以构建更加健壮的防御体系,有效应对DDoS攻击。然而,防御DDoS攻击的最佳方法是预防,企业应定期进行风险评估和安全演练,及时更新和强化安全措施,以提高网络的抵御能力和应对能力。
|
Dart IDE 开发工具
Flutter Version Manager (FVM): Flutter的版本管理终极指南
Flutter Version Manager (FVM): Flutter的版本管理终极指南
5177 1
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
263 9
字符串和list互转
字符串和list互转
235 0