SwiftUI控件

SwiftUI控件

SwiftUI学习的内容还是很多的,但是我们只对我们项目实战内容所涵盖的知识点进行讲解,
接下来介绍SwiftUI界面元素 、容器 、状态和数据流。

用户界面元素

struct Text

显示一行或多行只读文本的视图。

Text("Hamlet")
    .font(.title)
Text("by William Shakespeare")
    .font(.system(size: 12, weight: .light, design: .serif))
    .italic()
let attributedString = try! AttributedString(
    markdown: "_Hamlet_ by William Shakespeare")

var body: some View {
    Text(attributedString)
        .font(.system(size: 12, weight: .light, design: .serif))
}
Text("Brevity is the soul of wit.")
    .frame(width: 100)
    .lineLimit(1)
struct Label

用户界面项目的标准标签,由带有标题的图标组成。

Label("Lightning", systemImage: "bolt.fill")
Label("Lightning", systemImage: "bolt.fill")
    .labelStyle(.titleOnly)

Label("Lightning", systemImage: "bolt.fill")
    .labelStyle(.iconOnly)

Label("Lightning", systemImage: "bolt.fill")
    .labelStyle(.titleAndIcon)

使用视图制作标签,以编程方式组成标签的图标,而不是使用预制图像。

Label {
    Text(person.fullName)
        .font(.body)
        .foregroundColor(.primary)
    Text(person.title)
        .font(.subheadline)
        .foregroundColor(.secondary)
} icon: {
    Circle()
        .fill(person.profileColor)
        .frame(width: 44, height: 44, alignment: .center)
        .overlay(Text(person.initials))
}
struct TextField

显示可编辑文本界面的控件。

Label {
    Text(person.fullName)
        .font(.body)
        .foregroundColor(.primary)
    Text(person.title)
        .font(.subheadline)
        .foregroundColor(.secondary)
} icon: {
    Circle()
        .fill(person.profileColor)
        .frame(width: 44, height: 44, alignment: .center)
        .overlay(Text(person.initials))
}

@State private var givenName: String = ""
@State private var familyName: String = ""

var body: some View {
    VStack {
        TextField(
            "Given Name",
            text: $givenName
        )
        .disableAutocorrection(true)
        TextField(
            "Family Name",
            text: $familyName
        )
        .disableAutocorrection(true)
    }
    .textFieldStyle(.roundedBorder)
}

struct Image

显示图像的视图。

Image("Landscape_4")
    .resizable()
    .aspectRatio(contentMode: .fit)
struct Button

启动操作的控件。


Button(action: signIn) {
    Text("Sign In")
}

    Button {
       print("Action")
       } label: {
           Text("Cancel")
       }
struct Toggle

在开状态和关状态之间切换的控件。

@State private var vibrateOnRing = true

var body: some View {
    Toggle("Vibrate on Ring", isOn: $vibrateOnRing)
}

其他:

struct Link

导航到URL的控件。

struct Menu

用于显示操作菜单的控件。

struct Slider

从有界线性值范围内选择值的控件。

struct Stepper

执行增量和递减操作的控件。

struct Picker

从一组相互排斥的值中进行选择的控件。

struct DatePicker

选择绝对日期的控件。

struct ColorPicker

用于从系统颜色选择器UI中选择颜色的控件。

struct ProgressView

显示完成任务进展的观点。

struct Gauge

显示范围内值的视图。

容器

容器
布局容器 在容器视图(如堆栈和网格)内水平和垂直排列视图。使用布局容器来排列用户界面的元素。堆栈和网格会根据内容或界面维度的变化更新和调整它们包含的子视图的位置。您可以将布局容器嵌套到其他布局容器的任何深度,以实现复杂的布局效果。

struct HStack

将子视图排列在水平线上。

var body: some View {
    HStack(
        alignment: .top,
        spacing: 10
    ) {
        ForEach(
            1...5,
            id: \.self
        ) {
            Text("Item \($0)")
        }
    }
}

struct VStack

将子子排列成垂直线的视图。

var body: some View {
    VStack(
        alignment: .leading,
        spacing: 10
    ) {
        ForEach(
            1...10,
            id: \.self
        ) {
            Text("Item \($0)")
        }
    }
}
struct ZStack

覆盖其子视图,将它们对齐在两个轴上。


let colors: [Color] =
    [.red, .orange, .yellow, .green, .blue, .purple]

var body: some View {
    ZStack {
        ForEach(0..<colors.count) {
            Rectangle()
                .fill(colors[$0])
                .frame(width: 100, height: 100)
                .offset(x: CGFloat($0) * 10.0,
                        y: CGFloat($0) * 10.0)
        }
    }
}

<img width = 750 src="第12讲-SwiftUI/style/2.jpg">

如果您的视图只需要简单的网格或堆栈安排,布局容器就可以,复杂的可以使用收集容器。

收集容器

将视图分组到集合容器中,如列表、表和表单。

struct List

一种容器,显示排列在单个列中的数据行,可选地提供选择一个或多个成员的能力。


var body: some View {
    List {
        Text("A List Item")
        Text("A Second List Item")
        Text("A Third List Item")
    }
}


struct Ocean: Identifiable, Hashable {
    let name: String
    let id = UUID()
}

private var oceans = [
    Ocean(name: "Pacific"),
    Ocean(name: "Atlantic"),
    Ocean(name: "Indian"),
    Ocean(name: "Southern"),
    Ocean(name: "Arctic")
]

@State private var multiSelection = Set<UUID>()

var body: some View {
    NavigationView {
        List(oceans, selection: $multiSelection) {
            Text($0.name)
        }
        .navigationTitle("Oceans")
        .toolbar { EditButton() }
    }
    Text("\(multiSelection.count) selections")
}
struct Table

一种容器,显示排列在一个或多个列中的数据行,可选地提供选择一个或多个成员的能力。


struct Person: Identifiable {
    let givenName: String
    let familyName: String
    let id = UUID()
}
@State private var people = [
    Person(givenName: "Juan", familyName: "Chavez"),
    Person(givenName: "Mei", familyName: "Chen"),
    Person(givenName: "Tom", familyName: "Clark"),
    Person(givenName: "Gita", familyName: "Kumar"),
]
@State private var sortOrder = [KeyPathComparator(\Person.givenName)]

var body: some View {
    Table(people, sortOrder: $sortOrder) {
        TableColumn("Given Name", value: \.givenName)
        TableColumn("Family Name", value: \.familyName)
    }
    .onChange(of: sortOrder) {
        people.sort(using: $0)
    }
}
struct Form

用于对用于数据输入的控件进行分组的容器,例如在设置或检查器中。


var body: some View {
    NavigationView {
        Form {
            Section(header: Text("Notifications")) {
                Picker("Notify Me About", selection: $notifyMeAbout) {
                    Text("Direct Messages").tag(NotifyMeAboutType.directMessages)
                    Text("Mentions").tag(NotifyMeAboutType.mentions)
                    Text("Anything").tag(NotifyMeAboutType.anything)
                }
                Toggle("Play notification sounds", isOn: $playNotificationSounds)
                Toggle("Send read receipts", isOn: $sendReadReceipts)
            }
            Section(header: Text("User Profiles")) {
                Picker("Profile Image Size", selection: $profileImageSize) {
                    Text("Large").tag(ProfileImageSize.large)
                    Text("Medium").tag(ProfileImageSize.medium)
                    Text("Small").tag(ProfileImageSize.small)
                }
                Button("Clear Image Cache") {}
            }
        }
    }
}

struct Group

将内容类型的多个实例(如视图、场景或命令)收集到单个单元中的类型。

var body: some View {
    VStack {
        Group {
            Text("1")
            Text("2")
            Text("3")
            Text("4")
            Text("5")
            Text("6")
            Text("7")
            Text("8")
            Text("9")
            Text("10")
        }
        Text("11")
    }
}
struct ScrollView

可滚动视图。

var body: some View {
    ScrollView {
        VStack(alignment: .leading) {
            ForEach(0..<100) {
                Text("Row \($0)")
            }
        }
    }
}

演示容器

启用应用程序视图层次结构不同部分之间的导航。

使用演示容器为您的应用程序的用户界面提供结构,使用户能够在应用程序的各个部分之间轻松移动。例如,您可以使用Navigation在堆视图中向前和向后导航,使用Tab从选项卡栏中选择要显示的视图,或使用Outline逐步披露树结构中的视图。

struct NavigationView

用于显示代表导航层次结构中可见路径的视图堆栈的视图。

NavigationView {
    List(model.notes) { note in
        NavigationLink(note.title, destination: NoteEditor(id: note.id))
    }
    Text("Select a Note")
}

struct NavigationLink

控制导航演示文稿的视图。

NavigationLink(
    "Purple",
    destination: ColorDetail(color: .purple),
    isActive: $shouldShowPurple)
struct NavigationBarItem

导航栏的配置,表示导航堆栈顶部的视图。

分离器

struct Spacer

沿着其包含堆栈布局的主要轴扩展的灵活空间,如果没有包含在堆栈中,则在两个轴上扩展。

struct Divider

一种可用于分离其他内容的视觉元素。

对齐

struct Alignment

两个轴的对齐。

struct HorizontalAlignment

沿着水平轴的对齐位置。

struct VerticalAlignment

沿垂直轴的对齐位置。

protocol AlignmentID

用于识别对齐指南的类型。

struct ViewDimensions

视图的大小及其对齐在自己的坐标空间中引导。

边缘和区域

enum Edge

表示矩形一条边的枚举。

enum HorizontalEdge

水平轴上的边缘。

enum VerticalEdge

垂直轴上的边缘。

struct EdgeInsets

矩形两侧的插入距离。

struct SafeAreaRegions

一组象征性的安全区。

struct Anchor

从锚源和特定视图派生的不透明值。

struct OutlineGroup

从树结构、已识别数据的基础集合中按需计算视图和披露组的结构。

struct DisclosureGroup

根据披露控制状态显示或隐藏另一个内容视图的视图。

工具栏

struct ToolbarItem

表示可以放置在工具栏或导航栏中的项目的模型。

struct ToolbarItemGroup

表示一组ToolbarItem可以放置在工具栏或导航栏中的模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容