
SwiftUI中基础视图组件
SwiftUI中提供的基础组件
SwiftUI中提供了为数不多的视图组件,通过这些基础组件的组合,来组成我们想要的视图。
Text
Text用来展示文字,基础用法如下
Text("Hello, Welcome to Maxwell Spaces")
.kerning(2)
.fontWeight(.bold)
.lineSpacing(10)
.font(.largeTitle)
.foregroundColor(.blue)
.background(Color.green.opacity(0.2))
对于文字样式,SwiftUI提供了以下几种修饰符来调整:
kerning
:调整字间距lineSpacing
:调整行间距fontWeight
:调整字重,从轻到重依次为:ultraLight < thin < light < regular < medium < semibold < bold < heavy < black
其他的几个参数,基本见名知意,不再介绍。
使用Text需要注意的地方
kerning
、fontWeight
这两个修饰符只能作用在Text上,因此如果要调整Text的这两个样式,则必须将它们要放在其他修饰符之前,否则会报错- Text的接受参数并未String类型,而是
LocalizedStringKey
,这是用来做本地化的,Text会首先检查传入的字符串是不是LocalizedStringKey,有的话,就会展示本地化的字符串,没有的话,则会直接显示你传入的字符串。关于本地化的内容,以后再详细说。
TextField与SecureField
输入框,处理用户输入的相关操作,基本用法如下:
@State var username: String = ""
var body: some View {
TextField("请输入用户名", text: self.$username)
.padding()
}
TextField开始体现SwiftUI的魔法,只需要一个@State修饰的变量,再加上一个TextField的声明,就可以自动获取用户输入的内容:数据变化同步到视图;
但是我在使用过程中(当前时间2020年3月22号),却遇到神奇的无法输入中文的bug:用自带输入法无法输入中文,而第三方的搜狗等却可以。
这不得不使我放弃了它,转而使用UITextView包装一个自己的TextField。
此外,还要另外一个问题是:TextField无法实现多行,即使手动指定lineLimit
为大于1的数值,它仍然只显示一行。
所以,TextField目前的使用范围非常有限。
SecureField与TextField的区别在于:你输入的时候,它会显示小圆点,而不是原文,在输入密码等隐私性较强的内容的时候,它可以派上用场。只是,TextField存在的问题,SecureField一样存在。
Image
Image用来展示图片,还有苹果新出的SF Symbols。
展示assets文件中,名字为foo的图片
Image("foo")
展示SF Symbols中的"clock.fill"图形,注意此时的写法,一定别忘了加上systemName
Image(systemName: "clock.fill")
大小随可用空间自适应
Image("foo")
.resizable()
.aspectRatio(contentMode: .fit)
当然,也可以传入一个UIImage
Image(uiImage: UIImage("image-name"))
Image目前无法重新渲染图片的颜色,比如想把png格式的图片重新着色为其他颜色,此时只能通过UIImage的方式,然后再将UIImage传给Image。
Button
按钮,基本使用:
Button(action: {
// 点击后要做的事情,写在这里
}) {
Text("点我")
}
其中,Button的内容可以是任何View,不仅仅是Text。
默认情况下,Button会改变其Lable(就是按钮内容)的样式,因为Button会默认添加DefaultButtonStyle样式,这样的后果就是你的文字呈现出你不想要的颜色,比如文字变为蓝色;去除这种效果很简单,就是使用PlainButtonStyle:
Button(action: {
// 点击后要做的事情,写在这里
}) {
Text("点我")
}
.buttonStyle(PlainButtonStyle())
当然,我们还可以自定义按钮样式以及按钮点击时的效果(比如,点击时变很大或者点击时颜色改变成什么样),这个以后单独写。
NavigationLink
导航链接,实现页面跳转,本质也是一个Button。
使用NavigationLink时要注意的地方
- 使用时,必须在NavigationView内部才会生效
- 可以通过修改.buttonStyle(PlainButtonStyle())的方式改变其对内容的影响
- 有一些奇怪的bug,初次使用大概率会出现不能正常工作的情况:比如第一次工作,第二次不工作了等。
Toggle
开关按钮,基本上在iOS看到的开关控制都是它。
@State var open = false
var body: some View {
Toggle(isOn: self.$open) {
Text("")
}
}
Picker
选择器
DatePicker
日期选择器
Slider
滑块
Stepper
步进器