SwiftUI 学习笔记 20:项目 2-1 制作猜国旗应用
填充颜色
除了使用.background(Color.red)
以外的方式,我们还可以用ZStack
来设置颜色:
如果要在文本后面的整个区域填充红色,则应将颜色单独放置为ZStack–视为整体视图:
1 | ZStack { |
实际上,它本身Color.red 就是一种视图,这就是为什么可以像形状和文本一样使用它的原因。它会自动占用所有可用空间,但是你也可以使用frame()修饰符来询问特定的大小:
1 | Color.red.frame(width: 200, height: 200) |
内置颜色、语义颜色
SwiftUI为我们提供了内置的色彩与工作,比如一些Color.blue
,Color.green
等等。我们也有一些语义颜色:这些颜色不会说出它们所包含的色调,而是描述它们的用途。
例如,Color.primary
是SwiftUI中文本的默认颜色,根据用户设备是在亮模式还是暗模式运行,颜色将为黑色或白色。也有Color.secondary
,根据设备的不同,颜色也可能是黑色或白色,但现在透明度略有提高,因此其后面的一些颜色会发光。
在安全区内放置元素
如果希望内容进入安全区域,则可以使用edgesIgnoringSafeArea()修饰符指定要运行到的屏幕边缘。例如,这将创建一个ZStack,用红色填充屏幕边缘到边缘,然后在顶部绘制一些文本:
1 | ZStack { |
这是非常重要的,没有重要内容被放置在安全区域之外,因为它可能很难,如果不是不可能的用户看到。某些视图(例如List)允许内容滚动到安全区域之外,然后添加额外的插图,以便用户可以将内容滚动到视图中。
如果你的内容只是装饰性的(如此处的背景色),则可以将其扩展到安全区域之外。
渐变
SwiftUI为我们提供了三种可以使用的渐变,就像颜色一样,它们也是可以在我们的UI中绘制的视图。
渐变由以下几部分组成:
要显示的颜色数组
尺寸和方向信息
要使用的渐变类型
例如,线性渐变沿一个方向运行,因此我们为其提供了一个起点和终点,如下所示:
1 | LinearGradient(gradient: Gradient(colors: [.white, .black]), startPoint: .top, endPoint: .bottom) |
在Gradient那里使用的内部类型还可以提供渐变色标,你可以同时指定颜色和应沿着颜色使用多远的颜色。
相比之下,径向渐变以圆形向外移动,因此,我们没有指定方向,而是指定了起点和终点半径-颜色应从圆心到圆心的距离开始和停止变化。例如:
1 | RadialGradient(gradient: Gradient(colors: [.blue, .black]), center: .center, startRadius: 20, endRadius: 200) |
最后一种渐变类型称为角度渐变,尽管你可能听说过其他地方将其称为圆锥形或圆锥形渐变。这使颜色围绕一个圆圈循环而不是向外辐射,并且可以创建一些美丽的效果。
例如,这将以渐变的中心为中心在单个渐变中循环显示一系列颜色:
1 | AngularGradient(gradient: Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red]), center: .center) |
所有这些渐变都可以单独用作视图,也可以用作修改器的一部分–例如,你可以将它们用作文本视图的背景。
按钮和图像
SwiftUI中的按钮有两种显示方式,具体取决于外观。
制作按钮的最简单方法是当它仅包含一些文本时:传递按钮的标题,以及点击按钮时应运行的闭包:
1 | Button("Tap me!") { |
如果你还需要其他东西,例如图像或视图组合,则可以使用此替代形式
1 | Button(action: { |
当你要将图像合并到按钮中时,这尤其常见。
SwiftUI具有Image用于处理应用程序中图片的专用类型,你可以通过三种主要方式创建它们:
Image(“pencil”) 将加载你已添加到项目中的名为“铅笔”的图像。
Image(decorative: “pencil”)会加载同一张图片,但不会为启用了屏幕阅读器的用户读出。这对于不传递其他重要信息的图像很有用。
Image(systemName: “pencil”)将加载iOS内置的铅笔图标。这使用了Apple的SF Symbols图标集,你可以搜索所需的图标–从网络上下载Apple的免费SF Symbols应用程序以查看完整的图标集。
默认情况下,如果启用了屏幕阅读器,它将读取你的图像名称,因此,如果要避免混淆用户,请确保为图像提供清晰的名称。或者,如果他们实际上并未添加屏幕上其他地方尚未存在的信息,请使用Image(decorative:)初始化程序。
由于较长形式的按钮内部可以具有任何视图,因此可以使用如下图像:
1 | Button(action: { |
当然,你可以将它们与堆栈结合使用以制作更高级的按钮布局:
1 | Button(action: { |
提示:如果你发现图像已被某种颜色填充,例如显示为纯蓝色而不是实际图片,则可能是SwiftUI为它们着色以显示它们是可轻敲的。要解决此问题,请使用renderingMode(.original)修饰符强制SwiftUI显示原始图像,而不是重新着色的版本。
显示警报信息
如果发生重要事件,通知用户的一种常用方法是使用警报-一个弹出窗口,其中包含标题,消息和一个或两个按钮(取决于你的需要)。
但是请考虑一下:何时应该显示警报以及如何显示警报?视图是我们程序状态的函数,警报也不例外。因此,我们不用说“显示警报”,而是创建警报并设置显示警报的条件。
基本的SwiftUI警报具有标题,消息和一个关闭按钮,如下所示:
1 | Alert(--- |
如果需要,你可以添加更多代码来更详细地配置按钮,但这已经足够了。更有趣的是我们如何显示警报:我们不将警报分配给变量,而是编写类似之类的内容myAlert.show(),因为这将支持旧的“事件系列”思维方式。
相反,我们创建一些状态来跟踪警报是否显示,如下所示:
1 | private var showingAlert = false |
然后,我们将警报附加到用户界面的某处,告诉它使用该状态来确定是否显示警报。SwiftUI将监视showingAlert,一旦变为true,它将显示警报。
放在一起,下面是一些示例代码,当点击按钮时会显示警报:
1 | struct ContentView: View { |
这会将警报附加到按钮上,但是说实话,在何处使用alert()修饰符都没关系–我们要做的只是说警报存在,并且在showingAlerttrue 时显示。
仔细看一下alert()修饰符:
1 | .alert(isPresented: $showingAlert) |
这是另一种双向数据绑定,这是因为在取消showingAlert警报时,SwiftUI会自动设置为false。
参考资料
- 感谢你赐予我前进的力量