*SwiftUI is a modern way to declare user interfaces for any Apple platform. Create beautiful, dynamic apps faster than ever before.git
一种牛逼的更加快速,更加漂亮的用户界面的方法编程
Landmarks
,一个能够发现、分享你喜欢地点的App
)示例,来引导你们进行SwiftUI
开发。咱们将使用SwiftUI
框架来构建Landmark
详情界面。Landmarks
利用stacks
将图片和文本组合起来来进行视图布局。你须要引用MapKit
框架头文件来建立一个地图视图。 你能够经过Xcode
新的实时反馈功能,来优化你的视图布局 。SwiftUI
的新Xcode
项目。浏览画布、预览和SwiftUI
模板代码。要在
Xcode
中预览画布上的视图并与之交互,请确保您的Mac运行的是macOS 10.15 beta版
。swift
macOS 10.15 beta版下载地址 Xcode 11下载地址bash
点击以后你就会感受发现了新东西咯:app
默认状况下,SwiftUI视图文件声明两个结构。框架
如今咱们来玩玩预览:编辑器
若是画布没有展现出来,能够经过 Editor > Editor and Canvas 显示出来。ide
把Hello World更改成Hello SwiftUI! 当你修改文案后,SwiftUI会自动更新视图。 工具
你有两种方式来自定义TextView
。布局
view
代码inspector
检查器来帮助你进行代码编写。当你构建Landmarks
的时候,你能够运用任何一个编辑器来进行编码工做:直接修改源代码、经过画布、经过inspector view
检查器。代码并不会关心你用什么工具,它始终可以保持最新状态
preview
画布上,按住Command键+点按Text文本框
,这时候inspector
就会被唤起。 inspector
弹出框所展现的属性也会由于不一样的UI控件而有所不一样。经过inspector检查器
修改Text文本框的属性。
.color(.green)
把文本修改为绿色。SwiftUI视图
,你能够调用modifiers
方法。Modifiers
能够修改视图的属性,而且modifier
返回一个新的视图,因此一般会将多个modifiers
像链同样垂直堆叠在一块儿。( 链式编程)。import SwiftUI
struct ContentView: View {
var body: some View {
Text("Turtle Rock")
.font(.title)
.color(.green)
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
你编写的代码确定和view是一一对应的。当你经过inspector
修改了view
属性以后,Xcode
会自动更新你的代码。
这时候,打开inspector
,而后把文本Color属性
修改成Inherited。
注意一点的就是,Xcode
会根据inspector
修改自动更新你的代码。
咱们建立了一个文本框用来显示landmark
的详情信息,而且把这个文本控件放到头部。 当咱们建立SwiftUI
视图控件的时候,咱们会把控件的内容、布局还有一些行为放在body
属性中;然而body
属性只返回了一个view
。你能够利用stacks
嵌入多个view
,它能够垂直嵌入、水平嵌入等。 在这里,咱们将使用垂直stack
来显示park详情信息
。
Command+
点按text初始化方法区域。选择Embed in VStack
。
text view
到stack
中。Library面板
。拖拽一个text view
到 “Turtle Rock”后面 。修改text view
文案为Joshua Tree National Park
。
设置text view
的字体。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("Turtle Rock")
.font(.title)
Text("Joshua Tree National Park")
.font(.subheadline)
}
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
修改VStack
对齐方式。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
Text("Joshua Tree National Park")
.font(.subheadline)
}
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
若是不设置对齐方式,VStack
默认是内容垂直居中。
在面板中,Command+
点按 Joshua Tree National Park
唤起inspector
,选择Embed in HStack
。
在location
后面添加一个新的文本框,修改文本框文案并设置字体
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack {
Text("Joshua Tree National Park")
.font(.subheadline)
Text("California")
.font(.subheadline)
}
}
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
Space
来适应宽度。Space
把父视图在水平或者垂直方向上所有充满。import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
最后,利用padding()
来设置边距。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
复制代码
咱们已经把park名称和位置的视图作好了,接下来咱们将给park
添加个图片。 你不须要添加不少代码,就能够添加一个带mask、border、shadow
的图片。
添加一张图片到asset catalog
中。 在Resource
文件夹中找到turtlerock.png
图片,而后把它拖拽到asset catalog中。
选择File > New > File
打开模版选择面板。在 User Interface
区域,选择 SwiftUI View->Next
,命名为CircleImage.swift
。
把Text
构建方法替换成Image
。
import SwiftUI
struct CircleImage: View {
var body: some View {
Image("turtlerock")
}
}
struct CircleImage_Preview: PreviewProvider {
static var previews: some View {
CircleImage()
}
}
复制代码
调用.clipShape(Circle())
方法,建立圆形视图。
再建立一个圆圈,用灰色进行填充。并将它做为image
的border
。
import SwiftUI
struct CircleImage: View {
var body: some View {
Image("turtlerock")
.clipShape(Circle())
.overlay(
Circle().stroke(Color.gray, lineWidth: 4))
}
}
struct CircleImage_Preview: PreviewProvider {
static var previews: some View {
CircleImage()
}
}
复制代码
添加阴影。
将边框颜色更改成白色。
import SwiftUI
struct CircleImage: View {
var body: some View {
Image("turtlerock")
.clipShape(Circle())
.overlay(
Circle().stroke(Color.white, lineWidth: 4))
.shadow(radius: 10)
}
}
struct CircleImage_Preview: PreviewProvider {
static var previews: some View {
CircleImage()
}
}
复制代码
如今咱们须要建立一个地图视图。你能够MapKit
中的MKMapView
类来展现渲染地图界面。 在SwiftUI
中要使用UIView
或者其子类,你须要让你的view
遵循UIViewRepresentable协议
。SwiftUI
在WatchKit
和AppKit
一样声明了相似的协议
建立新的SwiftUI View
来展现MKMapView
。 File > New > File
,而后建立MapView.swift
引入MapKit
头文件,而且让MapView
遵循UIViewRepresentable
协议。
UIViewRepresentable
协议有两个协议方法须要实现。第一是UIView(context:)
来建立MKMapView
。第二个updateUIView(_:context:)
来更新view
。 把body
属性干掉,而后UIView(context:)
协议方法来建立MKMapView
。
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView(frame: .zero)
}
}
struct MapView_Preview: PreviewProvider {
static var previews: some View {
MapView()
}
}
复制代码
实现updateUIView(_:context:)
协议方法,来更新view
(设置地图经纬度等)。
func updateUIView(_ view: MKMapView, context: Context) {
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)
view.setRegion(region, animated: true)
}
复制代码
当在静态模式下进行预览的时候,Xcode
只能渲染SwiftUI
视图控件。由于MKMapView
是UIView子类
,因此你须要把模式切换成live模式才能正常预览。 点击Live Preview
切换预览模式。
如今咱们已经把全部子控件定义实现好了。 利用咱们现有的工具,咱们能够把这些子控件组合起来,造成完整的landmarks详情界面。
在工程导航区,选择ContentView.swift
文件。
在这三个text view
控件外面,再嵌入一个VStack
视图。
struct ContentView: View {
var body: some View {
VStack {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
}
}
}
复制代码
将你自定义的MapView
放在stack
的上面。设置MapView
的frame
。 若是你只设置了Mapview
的高度,那么MapView
会自动设置其宽度来适应父视图。因此MapView
会充满宽度区域。
struct ContentView: View {
var body: some View {
VStack {
MapView()
.frame(height: 300)
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
}
}
}
复制代码
点击Live Preview
来预览效果。 预览状态下,你能够继续编写view
的代码,Live Preview
会实时更新视图。
将CircleImage
添加到stack
上面。
struct ContentView: View {
var body: some View {
VStack {
MapView()
.frame(height: 300)
CircleImage()
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
}
}
}
复制代码
调整一下Image
的偏移。
在VStack
的底部添加spacer
占位。
最后设置下 edgesIgnoringSafeArea(.top) 。
总体写下来,就是感受很简单,很舒服.更加快速的面向开发,此时此刻还有谁! Swift 写天写地写世界,千秋万载,一统江湖