Landmarks
应用的首页是一个纵向滚动的地标类别列表,每一个类别内部是一个横向滑动列表。随后将构建应用的页面导航,这个过程中可以学习到如果组合各种视图,并让它们适配不同的设备尺寸和设备方向。
已经创建了所有在Landmarks
应用中需要的视图,现在给应用创建一个首页视图,把之前创建的视图整合起来。首页不仅仅包含之前创建的视图,它还提供页面间导航的方式,同时也可以展示各种地标信息。
步骤1 创建一个名为CategoryHome.swift
的自定义视图文件
步骤2 把应用的场景代理(scene delegate)的根视图从之前的地标列表视图更改为新创建的首页视图。现在应用启动后的每一个页面就是首页了,所以还需要添加从首页导航跳转到其它页面的方法。
步骤3 添加NavigationView
,这个NavigationView
将会容纳Landmarks
应用中其它不同的视图。配合使用NavigationView
、NavigationLink
及相关的修改器,就可以构建出应用的页面间导航结构
步骤4 设置导航栏标题为Featured
Landmarks
应用为了便于用户浏览各种类别的地标,将地标按类别竖向排列形成列表视图,对于每一个类别内的具体地标,又把它们按照水平方向排列,形成横向列表。组合使用垂直栈(vertical statck)和水平栈(horizontal stack)并给列表添加滚动
步骤1 使用Dictionary
结构体的初始化方法init(grouping:by:)
,把地标数据的类别属性category
传入作为分组依据,可以把地标数据按类别分组。工程文件中已经为每一个地标样本数据预定义了类别。
步骤2 使用List
显示地标数据的类别。Landmark.Category
是枚举类型,它的值标识列表中每一种类别,可以保证类别不会有重复定义
Landmarks
应用对每个类别下的地标采用横向滑动的行进行展示。添加一个新的视图类型用来表示这样一个地标行,然后使用这个新创建的行类型具体展示某一具体类型上的所有地标。
步骤1 定义一个新的视图类型,用来展示地标类别行的内容。新建行视图需要存放地标具体类别的展示数据
步骤2 更新CategoryHome.swift
的代码,把地标类别信息传给新建的行视图类型
步骤3 在CategoryRow.swift
中使用一个HStack
展示类别下的地标内容
步骤4 为行内容指定一个高度,并把行内容嵌入到ScrollView
中,以支持横向滑动。预览视图时,可以多增加几个地标数据,用来查看列表的滑动是否正常。
Landmarks
应用的首页在用户点击查看地标详情前需要先把地标的一些简单信息展示出来。复用之前创建的视图构建具体某一类别地标的行视图
步骤1 在CategoryRow.swift
文件中,与CategoryRow
类型并列,创建一个新的自定义视图类型CategoryItem
,用这个新的视图类型替换CategoryRow
的地标名称Text
控件
步骤2 在CategoryHome.swift
中,添加一个名为FeaturedLandmarks
的简单视图,这个视图用来显示地标数据中isFeatured
属性为真的那些地标。在之后的教程中,会把FeaturedLandmarks
这个视图修改成一个交互式轮播图。目前,这个视图仅仅展示一张缩放和剪裁后的地标图片。
步骤3 把视图的边距设置为0,让展示内容可以尽量贴着屏幕边沿
现在所有类别的地标都可以在首页视图中展示出来,用户还需要能够进入应用其它页面的方法。使用页面导航和相关API来实现用户从应用首页到地标详情页、收藏列表页及用户个人中心页的跳转。
步骤1 在CategoryRow.swift
中,把CategoryItem
视图包裹在NavigationLink
视图中。CategoryItem
这时做为跳转按钮的内容,destination
指定点击NavigationLink
按钮时要跳转的目标视图。
步骤2 使用renderingMode(_:)
和foregroundColor(_:)
这两个属性修改器来改变地标类别项的导航样式。做为NavigationLink
标签的CategoryItem
中的文本会使用Environment
中的强调颜色,图片可能以模板图片的方式渲染,这些都可以使用属性修改器来调整,达到最佳效果。
步骤3 在CategoryHome.swift
中,添加一个模态展示的用户信息展示页,点击了用户图标时弹出展示。当状态showProfile
被置为true
时,展示用户信息页,当showProfile
状态置为false
时,用户信息页消失。
步骤4 在导航条上添加一个按钮,用来切换showProfile
状态的值:true
或者false
步骤5 在CategoryHome.swift
中添加一个跳转链接,点击时跳转到全部地标的筛选页面。
步骤6 把LandmarkList.swift
中的把包裹地标列表视图的NavigationView
移动到对应的预览视图中。因为在应用中,LandmarkList
总是会被展示在CategoryHome.swift
定义的导航视图中。
问题1 对于Landmarks
这个应用来说,哪一个视图是它的根视图?
问题2 CategoryHome
这个视图是如何与应用的其它视图联动起来的
问题3 下面哪段代码可以将一个普通视图转化为一个具体点击导航功能的视图