本文参考 SwiftUI 官方示例 并将探索结果记录于此,希望能够对你有所帮助。
对于本文所述内容,默认你已有一定的基于 Swift 语言的开发经验,故不会详细的叙述每个细节;如果对 Swift 语法有疑问,可先学习 Swift 语法。
在了解和使用 SwiftUI
过程中,如果有疑问之处,可加入 SwiftUI QQ 交流群:18552966 ,共同交流。
如果你使用 Xcode 11.0 beta 2 (11M337n) 编译报错,参考这里
View | Layout |
---|---|
- macOS 15 Beta
- Xcode 11.0 Beta
- iOS 13.0 Beta
-
Text 文本
-
Image 图片
-
-
Picker 选择器
-
特殊视图
-
Stacks
-
List 列表
-
Container Views 容器视图
-
Architectural Views 导航、切换、排列
-
Alert 弹框、选择
-
Bindings
-
Data-Dependent Views
-
Environment Values
-
-
Preferences
-
Transactions
-
Basic Gestures 基本手势
-
Combined Gestures 合并手势
-
Custom Gestures 自定义手势
Text
用来展示一行或多行的文本内容,效果等同于 UILabel
,但更加优秀。
如果要创建 Text
, 只需通过 Text("SwiftUI")
即可创建;
采用链式语法,也可以为文本添加多项属性,如字体、颜色、阴影、上左下右的间距等。
示例:
Text("SwiftUI")
.color(.orange)
.bold()
.font(.system(.largeTitle))
.fontWeight(.medium)
.italic()
.shadow(color: .black, radius: 1, x: 0, y: 2)
HStack 和 VStack 控件用于承载多个视图,在后面会提到。
TextField
用来添加普通的输入框,一般常用作文本输入。
示例:
TextField(self.$name, placeholder: self.nameText, onEditingChanged: { changed in
print("onEditing: \(changed)")
}) {
print("userName: \(self.name)")
self.endEditing(true)
}}
.padding(10)
.frame(height: 50)
.textFieldStyle(.roundedBorder)
.padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
SecureField
一般作为密码输入时使用,使用方式与 TextField
并无差别,示例与运行效果同上 TextField
。
Image
控件用于展示图片。
示例:
Image("icon")
.resizable()
.frame(width: Length(100),
height: Length(100),
alignment: .center)
webImage
用于下载网络图片,使用的 URLSession
下载成功后替换原有 Image
;你也可以在 downloadWebImage
方法中使用 Kingfisher 。
示例:
var body: some View {
Image(uiImage: self.uiImage ?? placeholderImage)
.resizable()
.onAppear(perform: downloadWebImage)
.frame(width: Length(80),
height: Length(80),
alignment: .center)
.tapAction {
print("Tap ")
}
}
Button
用于响应点击事件。
示例:
Button(action: {
print("Tap")
}) {
Text("I'm a Button")
}
尚未发布
尚未发布
NavigationButtonPage
用以 Push 到下一个导航页面。
示例:
NavigationButton(destination: NavigationButtonPage()) {
Text("NavigationButton").bold().color(.orange).font(.largeTitle)
}.navigationBarItem(title: Text("Page"))
PresentationButton
用以弹出一个页面。
示例:
PresentationButton(PageRow(title: "PresentationButton", subTitle: "触发时显示内容的按钮控件"),
destination: Text("I'm Text")) {
print("Present 🦄")
}
EditButton
用以触发编辑状态,使用时只需在 navigationBarItems
设置即可。
示例:
navigationBarItems(trailing: EditButton())
尚未发布
Picker
可自定义数据源的选择器。
示例:
Picker(selection: $leftIndex, label: Text("Picker")) {
ForEach(0..<leftSource.count) {
Text(self.leftSource[$0]).tag($0)
}
}.frame(width: UIScreen.main.bounds.width/2)
DatePicker
用于选择绝对日期的控件。
示例:
DatePicker(
$server.date,
minimumDate: Calendar.current.date(byAdding: .year,
value: -1,
to: server.date),
maximumDate: Calendar.current.date(byAdding: .year,
value: 1,
to: server.date),
displayedComponents: .date
)
Toggle
用于切换选中状态。
示例:
Toggle(isOn: $isOn) {
Text("State: \(self.isOn == true ? "开":"关")")
}.padding(20)
Slider
用于从有限值范围中选值的控件。
示例:
Slider(value: $data.rating)
Stepper
用以增加或减少数值。
示例:
Stepper(value: $value, step: 2, onEditingChanged: { c in
print(c)
}) {
Text("Stepper Value: \(self.value)")
}.padding(50)
SegmentedControl
用以分段条件选择。
示例:
SegmentedControl(selection: $currentIndex) {
ForEach(0..<items.count) { index in
Text(self.items[index]).tag(index)
}
}.tapAction {
print("currentIndex: \(self.currentIndex)")
}
WebView
用于展示一个打开的网页。
示例:
struct WebViewPage : UIViewRepresentable {
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ uiView: WKWebView, context: Context) {
let req = URLRequest(url: URL(string: "https://www.apple.com")!)
uiView.load(req)
}
}
UIViewController
用于展示在 SwiftUI 中打开 UIKit 的 UIViewController ,并且在 UIViewController 中打开 SwiftUI
View。
示例:
先定义:
struct ControllerPage<T: UIViewController> : UIViewControllerRepresentable {
typealias UIViewControllerType = UIViewController
func makeUIViewController(context: UIViewControllerRepresentableContext<ControllerPage>) -> UIViewController {
return T()
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ControllerPage>) {
debugPrint("\(#function):\(type(of: T.self))")
}
}
然后调用:
NavigationButton(destination: ControllerPage<UIKitController>()) {
PageRow(title: "UIViewController",subTitle: "打开 UIViewController")
}
HStack
用于将子视图排列在水平线上的视图。
示例:
HStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
VStack
用于将子视图排列在垂直线上的视图。
示例:
VStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
ZStack
用于覆盖子视图,在两轴上对齐。
示例:
ZStack {
Text("made in China.")
Divider() // Just add a line.
Text("the People's Republic Of China.")
}
List
列表容器,用以显示一列数据。
示例:
List(0..<5) { item in
Text("Hello World !")
}.navigationBarTitle(Text("List"), displayMode: .large)
ScrollView
是一个滚动视图容器。
示例:
ScrollView {
Text("SwiftUI").padding(20)
Divider()
Image("icon").resizable()
.frame(width: 300, height: 300, alignment: .center)
Divider()
Text("Views and ... user interface.")
}
.border(style, width: 1,cornerRadius: 10)
.padding(10)
.navigationBarTitle(Text("ScrollView"))
ForEach
用于根据已有数据的集合展示视图。
示例:
let data = (0..<5).map { $0 }
var body: some View {
ForEach(data) { e in
Text("Hello \(e)")
.bold()
.font(.system(size: 25, design: .monospaced))
.padding(5)
}
Group
用于集合多个视图,对 Group 设置的属性,将作用于每个子视图。
示例:
Group {
Text("Hello World !")
Text("Hello World !")
}
尚未发布
Section
用于创建带头/尾部的视图内容,一般结合 List
组件使用。
示例:
Section(header: Text("I'm header"), footer: Text("I'm footer")) {
ForEach(0..<3) {
Text("Hello \($0)")
}
}
NavigationView
用于创建包含顶部导航栏的视图容器。
示例:
NavigationView {
Text("🧚♂️🧚♀️🧜♂️🧜♀️🧞♂️🧞♀️").blur(radius: 5)
Text("Swifter Swifter").bold().color(.orange).font(.largeTitle)
}.navigationBarTitle(Text("NavigationView"))
TabBar
用于创建包含底部 TabBar 的视图容器。
示例:
TabbedView(selection: $index) {
ForEach(0 ..< imgs.count) { item in
TabItemPage(index: item)
.tabItemLabel(Image(self.imgs[item]))
.tag(item)
}
}
尚未发布
尚未发布
Alert
用于展示一个弹框提醒,需要与点击事件关联起来。
示例:
presentation($showsAlert, alert: {
Alert(title: Text("Hello"))
})
ActionSheet
用于弹出一个选择框。
示例:
ActionSheet(title: Text("Title"),
message: Text("Message"),
buttons:
[.default(Text("Default"), onTrigger: {
print("Default")
self.showSheet = false
}),.destructive(Text("destructive"), onTrigger: {
print("destructive")
self.showSheet = false
}),.cancel({
print("Cancel")
self.showSheet = false
})])
Modal
用于弹出一个视图。
示例:
Modal(Text("Modal View"),onDismiss: {
print("View Dismiss !")
})
Popover
用于弹出一个视图,样式见下方运行结果。
示例:
Popover(content: Text("Popover View")) {
print("Popover Dismiss !")
}
- 以上示例中所涉及代码,皆在本仓库代码中,建议下载并运行查看。
- 如果有关于 SwiftUI 更好的用法与建议,期待能够一起分享!
- 如果本文示例内容有疏漏和错误之处,欢迎提 Issue !
email : [email protected]
微博 : @晋先森
SwiftUI is released under the GPL-3.0 license. See LICENSE for details.