SwiftUI官方教程(五)
5. 同時使用 UIKit 和 SwiftUI
至此,我們已准備好創建 map view 了,接下來使用 MapKit
中的 MKMapView
類來渲染地圖。
在 SwiftUI
中使用 UIView
子類,需要將其他 view 包裝在遵循 UIViewRepresentable
協議的 SwiftUI
view 中。 SwiftUI
包含了和 WatchKit
、 AppKit
view 類似的協議。
首先,我們創建一個可以呈現 MKMapView
的自定義 view。
SwiftUI教程
5.1 選擇 File
> New
> File
,選擇 iOS
平台,選擇 SwiftUI View
模板,然后單擊 Next
。將新文件命名為 MapView.swift
,然后單擊 Create
。
5.2 給 MapKit
添加 import
語句,聲明 MapView
類型遵循 UIViewRepresentable
。
可以忽略 Xcode 的錯誤,接下來的幾步會解決這些問題。
SwiftUI教程
MapView.swift
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
var body: some View {
Text("Hello World")
}
}
struct MapView_Preview: PreviewProvider {
static var previews: some View {
MapView()
}
}
UIViewRepresentable
協議需要實現兩個方法: makeUIView(context:)
用來創建一個 MKMapView
, updateUIView(_:context:)
用來配置 view 並響應修改。
5.3 用 makeUIView(context:)
方法替換 body
屬性,該方法創建並返回一個空的 MKMapView
。
MapView.swift
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
typealias UIViewType = MKMapView
func makeUIView(context: UIViewRepresentableContext<MapView>) -> MKMapView {
return MKMapView(frame: .zero)
}
}
struct MapView_Preview: PreviewProvider {
static var previews: some View {
MapView()
}
}
5.4 實現 updateUIView(_:context:)
方法,給 map view 設置坐標,使其在 Turtle Rock
上居中。
MapView.swift
import SwiftUI
import MapKit
struct MapView : UIViewRepresentable {
typealias UIViewType = MKMapView
func makeUIView(context: UIViewRepresentableContext<MapView>) -> MKMapView {
return MKMapView(frame: .zero)
}
func updateUIView(_ uiView: MKMapView, context: UIViewRepresentableContext<MapView>) {
let coordinate = CLLocationCoordinate2D(
latitude: 34.011286, longitude: -116.166868)
let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
let region = MKCoordinateRegion(center: coordinate, span: span)
uiView.setRegion(region, animated: true)
}
}
struct MapView_Preview: PreviewProvider {
static var previews: some View {
MapView()
}
}
當預覽處於 static mode
時僅顯示 SwiftUI
view 。因為 MKMapView
是一個 UIView
的子類,所以需要切換到實時模式才能看到地圖。
SwiftUI教程
5.5 單擊 Live Preview
可將預覽切換為實時模式,有時也會用到 Try Again
或 Resume
按鈕。
片刻之后,你會看到 Joshua Tree National Park
的地圖,這是 Turtle Rock
的故鄉。