不存在“2022年红绿灯新国标”,红灯停,绿灯行,黄灯亮了停一停~

简介: 不存在“2022年红绿灯新国标”,红灯停,绿灯行,黄灯亮了停一停~

不存在“2022年红绿灯新国标”,红灯停,绿灯行,黄灯亮了停一停~


项目背景

近几天一直闹的沸沸扬扬的“2022年红绿灯新国标”总算被辟谣了,自小我们所接受的教育是“红灯停,绿灯行,黄灯亮了停一停”,要一下子调整到奇奇怪怪的方式,怕是驾照白考,出门6分300块,哭哭~

刚好有点时间,这里就打算使用SwiftUI实现一个标准的红绿灯的逻辑。

那么,让我们开始吧。

项目搭建

首先,创建一个新的SwiftUI项目,命名为TrafficLight

image.png

我们先来看下最终的效果。

image.png

上述设计稿中,我们可以看到红绿灯包括灯光指示部分、灯光控制部分2大部分内容。

当我们调整下方灯光控制开关时,对应的灯光指示将切换至对应样式。

明白了逻辑后,我们来完成基础的样式部分。

App标题

首先是标题部分,我们使用常用的NavigationView构建标题,示例:

var body: some View {
    NavigationView {
        ZStack {
            Color(red: 246 / 255, green: 246 / 255, blue: 246 / 255).edgesIgnoringSafeArea(.all)
        }
        .NavigationView("红绿灯", displayMode: .inline)
    }
}

image.png

红绿灯部分

红绿灯灯光部分,由于我们需要通过不同的状态设置灯光,我们先声明好需要的变量,示例:

@State var isAllowTurnLeft: Bool = true
@State var isAllowGoStraight: Bool = true
@State var isAllowTrunRight: Bool = true
@State var isLeftWarning: Bool = false
@State var isGoStraightWarning: Bool = false
@State var isRightWarning: Bool = false

然后我们为了代码简洁和便于修改,我们单独构建3个红绿灯指示样式,示例:

// 左转
func leftLightView(isAllow: Bool, isWarning: Bool) -> some View {
    VStack(alignment: .center, spacing: 30) {
        Image(systemName: "arrow.backward")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .gray : .red)
        Image(systemName: "arrow.backward")
            .font(.system(size: 32))
            .foregroundColor(isWarning ? .yellow : .gray)
        Image(systemName: "arrow.backward")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .green : .gray)
    }
    .padding()
    .frame(height: 200)
    .background(.black)
    .cornerRadius(8)
}
// 直行
func goStraightLightView(isAllow: Bool, isWarning: Bool) -> some View {
    VStack(alignment: .center, spacing: 15) {
        Image(systemName: "circle.fill")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .gray : .red)
        Image(systemName: "circle.fill")
            .font(.system(size: 32))
            .foregroundColor(isWarning ? .yellow : .gray)
        Image(systemName: "circle.fill")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .green : .gray)
    }
    .padding()
    .frame(height: 200)
    .background(.black)
    .cornerRadius(8)
}
// 右转
func rightLightView(isAllow: Bool, isWarning: Bool) -> some View {
    VStack(alignment: .center, spacing: 30) {
        Image(systemName: "arrow.forward")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .gray : .red)
        Image(systemName: "arrow.forward")
            .font(.system(size: 32))
            .foregroundColor(isWarning ? .yellow : .gray)
        Image(systemName: "arrow.forward")
            .font(.system(size: 32))
            .foregroundColor(isAllow ? .green : .gray)
    }
    .padding()
    .frame(height: 200)
    .background(.black)
    .cornerRadius(8)
}

上述代码中,我们分别构建了红绿灯指示灯的视图:leftLightView左转视图、goStraightLightView直行视图、rightLightView右转视图。

然后通过传入变量isAllow判断该方向是否运行,并且根据isAllow变量、isWarning变量,设置对应灯光图片是否赋于颜色。

然后我们在body主体视图展示视图,示例:

VStack {
    // 红绿灯
    HStack(spacing: 20) {
        leftLightView(isAllow: isAllowTurnLeft, isWarning: isLeftWarning)
        goStraightLightView(isAllow: isAllowGoStraight, isWarning: isGoStraightWarning)
        rightLightView(isAllow: isAllowTrunRight, isWarning: isRightWarning)
    }.padding()
}

image.png

上述代码中,我们使用HStack横向布局,让三个灯光视图横向展示,并且传入的变量都绑定好我们提前声明好的变量。

规则设置部分

规则设置部分,我们也单独建立一个新的视图,示例:

// 规则列表
func ruleListView() -> some View {
    Form {
        Section {
            Toggle(isOn: $isAllowTurnLeft) {
                VStack(alignment: .leading, spacing: 5) {
                    Text("左转")
                        .font(.system(size: 17))
                        .foregroundColor(.black)
                    Text(isAllowTurnLeft ?"左转通行" : "禁止左转")
                        .font(.system(size: 14))
                        .foregroundColor(.gray)
                }
            }
            Toggle(isOn: $isAllowGoStraight) {
                VStack(alignment: .leading, spacing: 5) {
                    Text("直行")
                        .font(.system(size: 17))
                        .foregroundColor(.black)
                    Text(isAllowGoStraight ? "直行通行" : "禁止直行")
                        .font(.system(size: 14))
                        .foregroundColor(.gray)
                }
            }
            Toggle(isOn: $isAllowTrunRight) {
                VStack(alignment: .leading, spacing: 5) {
                    Text("右转")
                        .font(.system(size: 17))
                        .foregroundColor(.black)
                    Text(isAllowTrunRight ? "右转通行" : "禁止右转")
                        .font(.system(size: 14))
                        .foregroundColor(.gray)
                }
            }
        }.padding(.vertical, 5)
    }
}

image.png

上述代码中,我们使用Form列表和Section段落构建了规则设置视图ruleListView

在规则设置视图中,我们使用Toggle开关绑定对应的变量,并使用提前声明好的变量状态绑定展示不同的辅助文字。

另外为了去掉Form自带的列表背景颜色,我们还需要在页面载入时去掉List的背景颜色,示例:

init() {
        UITableView.appearance().backgroundColor = .clear
    }

项目预览

恭喜你,完成了本章的全部内容!

快来动手试试吧。

相关文章
|
算法
319. 灯泡开关【我亦无他唯手熟尔】
319. 灯泡开关【我亦无他唯手熟尔】
72 0
|
传感器 算法 Linux
【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)
【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)
152 0
【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)
BOSHIDA 三河博电科技 开关电源模块 遥控开/关电路
模块电源的遥控开关操作,是通过 REM 端进行的。一般控制方式有两种: (1)REM 与-VIN(参考地)相连,遥控关断,要求 VREF<0.4V。REM 悬空或与+VIN 相连,模块工作,要求 VREM>1V。 (2)REM 与 VIN 相连,遥控关断,要求 VREM<0.4V。REM 与+VIN 相连,模块工作,要求 VREM>1V。REM 悬空,遥控关断,即所谓“悬空关断”(-R)。 如果控制要与输入端隔离,则可以使用光电耦合器作为传递控制信号。
BOSHIDA 三河博电科技  开关电源模块 遥控开/关电路
|
算法 C++
每日算法系列【LeetCode 319】灯泡开关
每日算法系列【LeetCode 319】灯泡开关
142 0
|
传感器 机器学习/深度学习 监控
全身追踪、不怕遮挡,CMU两位华人做了个基于WiFi信号的DensePose
全身追踪、不怕遮挡,CMU两位华人做了个基于WiFi信号的DensePose
147 0
|
传感器
手持读数仪设置激励方法和激励电压
采集仪对振弦传感器激励:也称为“激振”,是振弦类传感器频率数据获取的必须过程,仅当传感器收 到合适的激励信号后才能产生自振,而仅当振弦传感器产生自振后才能输出频率信号,进一步的,读数电路会检测并读取振弦传感器的自振信号,才能通过计算得到 振动频率值。振弦传感器的激励信号(能够使传感器产生自振的外部信号)一般分 为两类,一类为高压短促脉冲,一类为特定频率的多组连续低压脉冲信号。
手持读数仪设置激励方法和激励电压
|
索引 容器
42.接雨水
42.接雨水
77 0
42.接雨水
|
图计算
|
开发工具
407. 接雨水 II
407. 接雨水 II
407. 接雨水 II