Xcode 11 beta :https://developer.apple.com/download/
1、建立一個新項目並探索畫布
建立一個使用SwiftUI的新Xcode項目。瀏覽畫布,預覽和SwiftUI模板代碼。swift
要預覽Xcode中畫布中的視圖並與之交互,請確保您的Mac正在運行macOS 10.15 beta。微信
第1步app
打開Xcode,在Xcode的啓動窗口中單擊「 建立新的Xcode項目」,或選擇 File > New > Project.編輯器

第2步ide
在模板選擇器中,選擇iOS做爲平臺,選擇Single View App模板,而後單擊Next。 工具
第3步
輸入「Landmarks」做爲Product Name,選擇Use SwiftUI複選框,而後單擊Next。選擇一個位置以在Mac上保存標記項目。
第4步
在項目導航器中,單擊以選中。ContentView.swift
默認狀況下,SwiftUI視圖文件聲明瞭兩種結構。第一個結構符合View
協議並描述視圖的內容和佈局。第二個結構聲明該視圖的預覽。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 Text("Hello World")
6 }
7 }
8
9 struct ContentView_Preview: PreviewProvider {
10 static var previews: some View {
11 ContentView()
12 }
13 }

第5步
注意:若是畫布不可見,請選擇Editor > Editor and Canvas以顯示它。
第6步
在body屬性
內,將「Hello World」更改成您本身的問候語。
當您更改視圖body
屬性中的代碼時,預覽會更新以反映您的更改。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 Text("Hello SwiftUI!")
6 }
7 }
8
9 struct ContentView_Preview: PreviewProvider {
10 static var previews: some View {
11 ContentView()
12 }
13 }

2、自定義文本視圖
您能夠經過更改代碼或使用檢查器發現可用內容並幫助您編寫代碼來自定義視圖的顯示。
在構建標記應用程序時,您可使用任何編輯器組合:源編輯器,畫布或檢查器。不管您使用哪一種工具,代碼都會保持更新。
步驟1
在預覽中,按住Command鍵並單擊問候語以顯示結構化編輯彈出窗口,而後選擇「 檢查」。
彈出窗口顯示您能夠自定義的不一樣屬性,具體取決於您檢查的視圖類型。
第1步
在預覽中,按住Command鍵並單擊問候語以顯示結構化編輯彈出窗口,而後選擇「 檢查」。
彈出窗口顯示您能夠自定義的不一樣屬性,具體取決於您檢查的視圖類型。
第2步
使用檢查器將文本更改成「Turtle Rock」,即您將在應用中顯示的第一個地標的名稱。
第3步
這將系統字體應用於文本,以便它正確響應用戶的首選字體大小和設置。
第4步
手動編輯代碼以添加color(.green)
修飾符; 這會將文本的顏色更改成綠色。
要自定義SwiftUI視圖,請調用稱爲修飾符的方法。修改器包裝視圖以更改其顯示或其餘屬性。每一個修改器都返回一個新視圖,所以連接垂直堆疊的多個修改器是很常見的。
1 ContentView.swift
2 import SwiftUI
3
4 struct ContentView: View {
5 var body: some View {
6 Text("Turtle Rock")
7 .font(.title)
8 .color(.green)
9 }
10 }
11
12 struct ContentView_Preview: PreviewProvider {
13 static var previews: some View {
14 ContentView()
15 }
16 }

您的代碼始終是視圖的真實來源。當您使用檢查器更改或刪除修改器時,Xcode會當即更新您的代碼以匹配。
第5步
此次,經過Text
在代碼編輯器中單擊聲明來打開檢查器,而後從彈出窗口中選擇Inspect。單擊「 顏色」彈出菜單,而後選擇「 繼承」以再次將文本顏色更改成黑色。

第6步
請注意,Xcode會自動更新代碼以反映更改,刪除color(.green)
修飾符。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 Text("Turtle Rock")
6 .font(.title)
7
8 }
9 }
10
11 struct ContentView_Preview: PreviewProvider {
12 static var previews: some View {
13 ContentView()
14 }
15 }

3、使用堆棧組合視圖
除了您在上一部分中建立的標題視圖以外,您還將添加文本視圖以包含有關地標的詳細信息,例如公園的名稱和狀態。
建立SwiftUI視圖時,您能夠在視圖的body
屬性中描述其內容,佈局和行爲; 可是,該body
屬性僅返回單個視圖。您能夠在堆棧中組合和嵌入多個視圖,這些視圖將視圖水平,垂直或從後到前組合在一塊兒。
在本節中,您將使用垂直堆棧將標題置於包含公園詳細信息的水平堆棧上方。
您可使用Xcode的結構化編輯支持將視圖嵌入容器視圖,打開檢查器或幫助進行其餘有用的更改。
第1步
按住Command鍵並單擊文本視圖的初始值設定項以顯示結構化編輯彈出窗口,而後選擇「 嵌入VStack」。
接下來,您將經過Text
從庫中拖動視圖來向堆棧添加文本視圖。

第2步
單擊Xcode窗口右上角的加號按鈕(+)打開庫,而後Text
在「Turtle Rock」文本視圖後當即將視圖拖到代碼中的位置。

第3步
Text
用Joshua Tree National Park替換視圖的佔位符文本。自定義位置以匹配所需的佈局。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack {
6 Text("Turtle Rock")
7 .font(.title)
8 Text("Joshua Tree National Park")
9 }
10 }
11 }
12
13 struct ContentView_Preview: PreviewProvider {
14 static var previews: some View {
15 ContentView()
16 }
17 }

第4步
將位置的字體設置爲subheadline
。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack {
6 Text("Turtle Rock")
7 .font(.title)
8 Text("Joshua Tree National Park")
9 .font(.subheadline)
10 }
11 }
12 }
13
14 struct ContentView_Preview: PreviewProvider {
15 static var previews: some View {
16 ContentView()
17 }
18 }

第5步
默認狀況下,堆棧將其內容沿其軸居中,並提供適合上下文的間距。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack(alignment: .leading) {
6 Text("Turtle Rock")
7 .font(.title)
8 Text("Joshua Tree National Park")
9 .font(.subheadline)
10 }
11 }
12 }
13
14 struct ContentView_Preview: PreviewProvider {
15 static var previews: some View {
16 ContentView()
17 }
18 }

接下來,您將在該位置的右側添加另外一個文本視圖,這是該公園的狀態。
第6步
在畫布上,按住Command鍵點擊約書亞樹國家公園,而後選擇嵌入HStack。

第7步
在位置後添加新文本視圖,將佔位符文本更改成park的狀態,而後將其字體設置爲subheadline
。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack(alignment: .leading) {
6 Text("Turtle Rock")
7 .font(.title)
8 HStack {
9 Text("Joshua Tree National Park")
10 .font(.subheadline)
11 Text("California")
12 .font(.subheadline)
13 }
14 }
15 }
16 }
17
18 struct ContentView_Preview: PreviewProvider {
19 static var previews: some View {
20 ContentView()
21 }
22 }

第8步
要指示佈局使用設備的整個寬度,請經過向包含Spacer
兩個文本視圖的水平堆棧添加a 來分隔park和state 。
甲間隔擴展以使其含有視圖中使用它的父視圖的空間的全部,而不是具備其大小僅經過其內容來定義。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack(alignment: .leading) {
6 Text("Turtle Rock")
7 .font(.title)
8 HStack {
9 Text("Joshua Tree National Park")
10 .font(.subheadline)
11 Spacer()
12 Text("California")
13 .font(.subheadline)
14 }
15 }
16 }
17 }
18
19 struct ContentView_Preview: PreviewProvider {
20 static var previews: some View {
21 ContentView()
22 }
23 }

第9步
最後,使用padding()
修改器方法爲地標的名稱和細節提供一點呼吸空間。
1 import SwiftUI
2
3 struct ContentView: View {
4 var body: some View {
5 VStack(alignment: .leading) {
6 Text("Turtle Rock")
7 .font(.title)
8 HStack {
9 Text("Joshua Tree National Park")
10 .font(.subheadline)
11 Spacer()
12 Text("California")
13 .font(.subheadline)
14 }
15 }
16 .padding()
17 }
18 }
19
20 struct ContentView_Preview: PreviewProvider {
21 static var previews: some View {
22 ContentView()

4、建立自定義圖像視圖
經過設置名稱和位置視圖,接下來要作的是爲地標添加圖像。
您將建立一個自定義視圖,將遮罩,邊框和陰影應用於圖像,而不是在此文件中添加更多代碼。
接下來,您將爲自定義圖像視圖建立一個新的SwiftUI視圖。
第2步
選擇 File > New > File,以再次打開模板選擇器 在「 User Interface」部分中,單擊以選中「 SwiftUI視圖」,而後單擊「 Next」。命名文件,而後單擊「 Create」。CircleImage.swift
您已準備好插入圖像並修改其顯示以匹配所需的設計。
第3步
使用Image(_:)
初始化程序將文本視圖替換爲Turtle Rock的圖像。
1 import SwiftUI
2
3 struct CircleImage: View {
4 var body: some View {
5 Image("turtlerock")
6 }
7 }
8
9 struct CircleImage_Preview: PreviewProvider {
10 static var previews: some View {
11 CircleImage()
12 }
13 }

第4步
添加調用以將圓形剪裁形狀應用於圖像。clipShape(Circle())
的Circle
類型是一個形狀,能夠經過賦予圓的行程使用做爲掩模,或做爲視圖或填充。
1 import SwiftUI
2
3 struct CircleImage: View {
4 var body: some View {
5 Image("turtlerock")
6 .clipShape(Circle())
7 }
8 }
9
10 struct CircleImage_Preview: PreviewProvider {
11 static var previews: some View {
12 CircleImage()
13 }
14 }

第5步
建立另外一個帶有灰色筆觸的圓,而後將其添加爲疊加層覺得圖像添加邊框。
1 import SwiftUI
2
3 struct CircleImage: View {
4 var body: some View {
5 Image("turtlerock")
6 .clipShape(Circle())
7 .overlay(
8 Circle().stroke(Color.gray, lineWidth: 4))
9 }
10 }
11
12 struct CircleImage_Preview: PreviewProvider {
13 static var previews: some View {
14 CircleImage()
15 }
16 }

第6步
1 import SwiftUI
2
3 struct CircleImage: View {
4 var body: some View {
5 Image("turtlerock")
6 .clipShape(Circle())
7 .overlay(
8 Circle().stroke(Color.gray, lineWidth: 4))
9 .shadow(radius: 10)
10 }
11 }
12
13 struct CircleImage_Preview: PreviewProvider {
14 static var previews: some View {
15 CircleImage()
16 }
17 }

第7步
1 import SwiftUI
2
3 struct CircleImage: View {
4 var body: some View {
5 Image("turtlerock")
6 .clipShape(Circle())
7 .overlay(
8 Circle().stroke(Color.white, lineWidth: 4))
9 .shadow(radius: 10)
10 }
11 }
12
13 struct CircleImage_Preview: PreviewProvider {
14 static var previews: some View {
15 CircleImage()
16 }
17 }

5、一塊兒使用UIKit和SwiftUI視圖
如今您已準備好建立地圖視圖。您可使用MapKit中的類來渲染地圖。MKMapView
要UIView
在SwiftUI中使用子類,能夠將其餘視圖包裝在符合協議的SwiftUI視圖中。SwiftUI包含WatchKit和AppKit視圖的相似協議。UIViewRepresentable

首先,您將建立一個能夠顯示的新自定義視圖。MKMapView
第2步
爲該類型添加import
語句,並聲明該類型的一致性。MapKit
UIViewRepresentable
MapView
不要擔憂Xcode顯示的錯誤; 你將在接下來的幾個步驟中解決這個問題。
該協議有你須要添加兩個要求:一個是建立一個方法,而且該配置視圖和響應任何變化的方法。UIViewRepresentable
makeUIView(context:)
MKMapView
updateUIView(_:context:)
1 import SwiftUI
2 import MapKit
3
4 struct MapView: UIViewRepresentable {
5 var body: some View {
6 Text("Hello World")
7 }
8 }
9
10 struct MapView_Preview: PreviewProvider {
11 static var previews: some View {
12 MapView()
13 }
14 }
第3步
使用建立並返回空body
的方法替換該屬性。makeUIView(context:)
MKMapView
1 import SwiftUI
2 import MapKit
3
4 struct MapView: UIViewRepresentable {
5 func makeUIView(context: Context) -> MKMapView {
6 MKMapView(frame: .zero)
7 }
8 }
9
10 struct MapView_Preview: PreviewProvider {
11 static var previews: some View {
12 MapView()
13 }
14 }
第4步
建立一個方法,將地圖視圖的區域設置爲正確的座標,以使地圖在Turtle Rock上居中。updateUIView(_:context:)
當預覽處於靜態模式時,它們僅徹底呈現SwiftUI視圖。由於是子類,因此您須要切換到實時預覽才能看到地圖。MKMapView
UIView
1 import SwiftUI
2 import MapKit
3
4 struct MapView: UIViewRepresentable {
5 func makeUIView(context: Context) -> MKMapView {
6 MKMapView(frame: .zero)
7 }
8
9 func updateUIView(_ view: MKMapView, context: Context) {
10 let coordinate = CLLocationCoordinate2D(
11 latitude: 34.011286, longitude: -116.166868)
12 let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
13 let region = MKCoordinateRegion(center: coordinate, span: span)
14 view.setRegion(region, animated: true)
15 }
16 }
17
18 struct MapView_Preview: PreviewProvider {
19 static var previews: some View {
20 MapView()
21 }
22 }
第5步
單擊「 實時預覽」按鈕可將預覽切換爲實時模式。您可能須要單擊預覽上方的「重試」或「 恢復」按鈕。
片刻以後,你會看到Joshua Tree National Park的地圖,這是龜背巖的故鄉。

6、撰寫詳細信息視圖