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需要注意的地方

  • kerningfontWeight这两个修饰符只能作用在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时要注意的地方

  1. 使用时,必须在NavigationView内部才会生效
  2. 可以通过修改.buttonStyle(PlainButtonStyle())的方式改变其对内容的影响
  3. 有一些奇怪的bug,初次使用大概率会出现不能正常工作的情况:比如第一次工作,第二次不工作了等。

Toggle

开关按钮,基本上在iOS看到的开关控制都是它。

@State var open = false
var body: some View {
    Toggle(isOn: self.$open) {
        Text("")
    }
}

Picker

选择器

DatePicker

日期选择器

Slider

滑块

Stepper

步进器