SwiftUI List, ScrollView, LazyVGrid, Form, Spacer, Divider, NavigationView, TabView

2 List, 一个容器,显示排列在单个列中的数据行。类似于 UIKit 中 UITableView 的效果

创建静态可滚动 列表

List {
        Text("Hello world")
        Text("Hello world")
        Text("Hello world")
      }
截屏2023-06-15 00.01.09.png

混合排版

List {
        Text("Hello world")
        Image(systemName: "clock")
      }
截屏2023-06-15 00.02.24.png

创建动态列表

let names = ["John", "Apple", "Seed"]
      List(names, id: \.self) { name in
        Text(name)
      }
截屏2023-06-19 00.06.06.png

添加 section

List {
        Section(header: Text("UIKit"), footer: Text("We will miss you")) {
          Text("UITableView")
        }

        Section(header: Text("SwiftUI"), footer: Text("A lot to learn")) {
          Text("List")
        }
      }
截屏2023-06-19 20.19.47.png

要使其分组添加 .listStyle(GroupedListStyle()), 要使其插入分组 (.insetGrouped),请添加 .listStyle(GroupedListStyle()) , ??? 并强制常规水平尺寸类 .environment(.horizontalSizeClass, .regular)。

List {
        Section(header: Text("UIKit"), footer: Text("We will miss you")) {
          Text("UITableView")
        }

        Section(header: Text("SwiftUI"), footer: Text("A lot to learn")) {
          Text("List")
        }
      }
      .listStyle(.grouped )
      .environment(\.horizontalSizeClass, .regular)
截屏2023-06-19 20.23.06.png

1 ScrollView, 滚动包装内容视图。滑动方向设置 ScrollView(.horizontal / .vertical) 或者 ScrollView([.horizontal, .vertical]) 多选

ScrollView {
        Image(systemName: "swift")
        Text("Hello World")
      }
截屏2023-06-19 20.48.46.png

1.1 要使用 ScrollView,您需要放置一个 content 视图 您想要使其可滚动作为滚动视图内容。

ScrollView {
        VStack {
          ForEach(0..<100) { i in
            Text("Item \(i)")
          }
        }.frame(maxWidth: .infinity)
        
      }
Simulator Screenshot - iPhone 8 - 2023-06-19 at 20.51.53.png

LazyHGrid, 将其子视图排列在水平增长的网格中的容器视图,仅根据需要创建项目。

 var rows: [GridItem] =
              Array(repeating: .init(.fixed(20)), count: 2)

      ScrollView(.horizontal) {
        LazyHGrid(rows: rows, alignment: .top) {
          ForEach((0...100), id: \.self) {
            Text("\($0)").background(Color.pink)
          }
        }
        
      }
截屏2023-06-19 21.10.19.png

LazyVGrid, 将其子视图排列在垂直增长的网格中的容器视图,仅根据需要创建项目

var columns: [GridItem] =
              Array(repeating: .init(.fixed(20)), count: 5)

      ScrollView {
        LazyVGrid(columns: columns) {
          ForEach((0...100), id: \.self) {
            Text("\($0)").background(Color.pink)
          }
        }
        
      }
Simulator Screenshot - iPhone 8 - 2023-06-19 at 21.20.31.png

Form, 用于对用于数据输入的控件进行分组的容器,例如在设置或检查器中。您可以将几乎任何东西放入这个 Form 中,它会呈现适合表单的样式。

@State private var date = Date()
  @State private var selection: Int = 2
  
  var body: some View {
    VStack {
      
      
      
      NavigationView {
        Form {
          Section {
            Text("Plain Text")
            Stepper(value: $quantity, in: 0...10, label: { Text("Quantity") })
          }
          
          Section {
            DatePicker(selection: $date, label: { Text("Due Date") })
            Picker(selection: $selection, label:
                    Text("Picker Name")
                   , content: {
              Text("Value 1").tag(0)
              Text("Value 2").tag(1)
              Text("Value 3").tag(2)
              Text("Value 4").tag(3)
            })
          }
        }
        
      }
Simulator Screenshot - iPhone 8 - 2023-06-19 at 21.28.52.png

Spacer, 沿其包含堆栈布局的主轴扩展的灵活空间,或如果不包含在堆栈中,则在两个轴上。

HStack {
      Image(systemName: "clock")
      Spacer()
      Text("Time")
    }
    
    VStack {
      Image(systemName: "clock")
      Spacer()
      Text("Time")
      
    }
Simulator Screenshot - iPhone 8 - 2023-06-19 at 21.33.39.png

Divider, 分割线, 可用于分隔其他内容的视觉元素。

HStack {
    Image(systemName: "clock")
    Divider()
    Text("Time")
}.fixedSize()
截屏2023-06-19 21.35.20.png

NavigationView, 一个视图,用于显示表示导航中可见路径的视图堆栈层次结构。largeTitle

NavigationView {
        List {
            Text("Hello World")
        }
        .navigationBarTitle(Text("Navigation Title")) // Default to large title style
    }.foregroundColor(.red
截屏2023-06-19 21.38.11.png

旧式标题,

NavigationView {
    List {
        Text("Hello World")
    }
    .navigationBarTitle(Text("Navigation Title"), displayMode: .inline)
}
截屏2023-06-19 21.39.17.png

添加UIBarButtonItem.

NavigationView {
    List {
        Text("Hello World")
    }
    .navigationBarItems(trailing:
        Button(action: {
            // Add action
        }, label: {
            Text("Add")
        })
    )
    .navigationBarTitle(Text("Navigation Title"))
}
截屏2023-06-19 21.41.16.png

添加 show/push 和 导航链接, 用于 UISplitViewController

NavigationView {
    List {
        NavigationLink("Go to detail", destination: Text("New Detail"))
    }.navigationBarTitle("Master")
    Text("Placeholder for Detail")
}
截屏2023-06-19 21.43.06.png

您可以使用两个新的样式属性设置 NavigationView 的样式:stack 和 doubleColumn。 默认情况下,iPhone 和 Apple TV 上的导航视图直观地反映导航堆栈,而在 iPad 和 Mac 上,拆分视图样式导航视图显示。

您可以使用 .navigationViewStyle 覆盖它。

NavigationView {
        List {
            Text("Hello World")
        }
        .navigationBarItems(trailing:
            Button(action: {
                // Add action
            }, label: {
                Text("Add")
            })
        )
        .navigationBarTitle(Text("Navigation Title"))
    }
    .navigationViewStyle(.stack)
截屏2023-06-19 21.48.23.png

在 iOS 14 中,UISplitViewController 新增了侧边栏样式。 你也可以通过在 NavigationView 下放置三个视图来做到这一点。

NavigationView {
    Text("Sidebar")
    Text("Primary")
    Text("Detail")
}.navigationSplitViewStyle(.prominentDetail
detail
截屏2023-06-19 22.04.48.png

在toolbarItems中添加UIToolbar UIViewController。

NavigationView {
      Text("SwiftUI").padding()
        .toolbar {
          ToolbarItem(placement: .bottomBar) {
            Button {
              
            } label: {
              Image(systemName: "archivebox")
            }
          }
          
          ToolbarItem(placement: .bottomBar) {
            Spacer()
          }
          
          ToolbarItem(placement: .bottomBar) {
            Button {
              
            } label: {
              Image(systemName: "square.and.pencil")
            }
          }
        }
      
    }
截屏2023-06-19 22.09.39.png

TabView, 允许使用可交互用户在多个子视图之间切换的视图界面元素, 如 图像和文本在一起

TabView {
    Text("First View")
        .font(.title)
        .tabItem({
            Image(systemName: "circle")
            Text("First")
        })
        .tag(0)
    Text("Second View")
        .font(.title)
        .tabItem({ Text("Second") })
        .tag(1)
}
截屏2023-06-19 22.25.03.png

UIPageViewController, 成为 TabView 的一种样式。 使用页面查看样式,在标签上使用 .tabViewStyle(PageTabViewStyle()) 修饰符查看。 == UIPageControll

TabView {
        Text("1")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.pink)
        Text("2")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.red)
        Text("3")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.green)
        Text("4")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.blue)
    }.tabViewStyle(.page)
截屏2023-06-19 22.30.18.png

tabViewStyle(.page(indexDisplayMode: .never)) 将不显示 四个圆点, 无图

.always 显示背景

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

推荐阅读更多精彩内容