使用SwiftUI搭建一个智能家居的开关灯页面,我是有多无聊~

简介: 使用SwiftUI搭建一个智能家居的开关灯页面,我是有多无聊~

使用SwiftUI搭建一个智能家居的开关灯页面,我是有多无聊~


项目背景

晚上临睡前看着头顶上的卧室灯,圆圆的,点击开灯亮起,再点击关灯熄灭,以此反复。

突然大脑里有了一个无聊的灵感,干脆做一个开关灯的App,可以打发无聊的时间。

说干就干。

项目搭建

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

image.png

背景卡片

首先是背景部分,我们可以使用Rectangle矩形作为背景卡片的设计元素,示例:

// 背景卡片
func bgCard() -> some View {
    Rectangle()
        .foregroundColor(Color(red: 88 / 255, green: 132 / 255, blue: 234 / 255))
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
        .cornerRadius(16)
        .shadow(radius: 2)
        .padding()
}

上述代码中,我们创建了一个bgCard视图。

我们给Rectangle矩形增加了背景颜色foregroundColor修饰符,使用frame尺寸修饰符设置了矩形的大小,使用cornerRadius修饰符设置了矩形的圆角,使用shadow修饰符设置了矩形的阴影,最后使用了padding给矩形加了边距。

image.png

页面标题

然后是页面标题部分,我们可以使用Text文字作为页面标题,示例:

// 标题
func titleView() -> some View {
    Text("卧室灯")
        .font(.system(size: 17))
        .fontWeight(.bold)
        .padding(.top, 40)
        .foregroundColor(.white)
}

上述代码中,我们创建了一个titleView视图。

我们给Text文字设置文字内容为卧室灯,使用fontsystem修饰符设置文字字号,使用fontWeight修饰符让文字加粗,使用padding边距修饰符让文字距离上边距40,使用foregroundColor修饰符设置文字颜色为白色

image.png

灯视图

对于灯视图,由于我们的灯有开启关闭两种状态,因此我们首先需要声明一个变量来存储这个状态,示例:

@State var isOpen: Bool = false

然后我们可以使用Circle来构建灯的样式,示例:

// 灯
func lightView() -> some View {
    Circle()
        .stroke(Color(.systemGray6), lineWidth: 80)
        .opacity(isOpen ? 0.9 : 0.5)
        .frame(width: 20, height: 20, alignment: .center)
        .shadow(color: .white, radius: isOpen ? 30 : 0, x: 0, y: 0)
}

上述代码中,我们创建了一个lightView视图。

我们使用Circle创建了一个圆,然后使用stroke修饰符给这个圆设置了边框颜色和边框宽度,根据isOpen的状态使用opacity设置透明度,使用frame修饰符设置了灯的大小,使用shadow修饰符设置了灯的阴影颜色和阴影面积。

这里我们根据isOpen的状态和透明度、阴影修饰符的作用,构建了开灯时的样式及关闭时的样式。

image.png

开关按钮

然后是开关按钮,我们使用Image图片和Text文字作为开关灯的操作按钮和标识文字,示例:

// 开关
func switchBtn() -> some View {
    VStack(spacing: 20) {
        Image(systemName: "power")
            .foregroundColor(isOpen ? .white : .black)
            .font(.system(size: 32))
            .onTapGesture {
                self.isOpen.toggle()
            }
        Text(isOpen ? "点击关灯" : "点击开灯")
            .font(.system(size: 17))
            .fontWeight(.bold)
            .foregroundColor(isOpen ? .white : .black)
    }.padding(.bottom, 80)
}

上述代码中,我们创建了一个switchBtn视图。

我们使用VStack垂直排布的方式布置操作按钮和文字,操作按钮部分,我们使用Image构建按钮,使用Apple提供的系统图标。

根据isOpen的状态使用foregroundColor修饰符设置按钮颜色,开启时为白色,关闭时为黑色。使用font修饰符设置按钮大小,使用onTapGesture修饰符给图标添加点击的交互动作,当点击图标时,isOpen的状态被切换。

文字部分就有个小逻辑,即当isOpen开启的时候,文字应该提示“点击关灯”,而当isOpen处于关闭状态时,文字提示“点击开灯”。

image.png

整体布局

最后我们在body视图中进行所有视图的布局,示例:

var body: some View {
    ZStack {
        bgCard()
        VStack {
            titleView()
            Spacer()
            lightView()
            Spacer()
            Spacer()
            switchBtn()
        }
    }
}

项目展示

image.png

本章代码

import SwiftUI
struct ContentView: View {
    @State var isOpen: Bool = false
    var body: some View {
        ZStack {
            bgCard()
            VStack {
                titleView()
                Spacer()
                lightView()
                Spacer()
                Spacer()
                switchBtn()
            }
        }
    }
    // 背景卡片
    func bgCard() -> some View {
        Rectangle()
            .foregroundColor(Color(red: 88 / 255, green: 132 / 255, blue: 234 / 255))
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .cornerRadius(16)
            .shadow(radius: 2)
            .padding()
    }
    // 标题
    func titleView() -> some View {
        Text("卧室灯")
            .font(.system(size: 17))
            .fontWeight(.bold)
            .padding(.top, 40)
            .foregroundColor(.white)
    }
    // 灯
    func lightView() -> some View {
        Circle()
            .stroke(Color(.systemGray6), lineWidth: 80)
            .opacity(isOpen ? 0.9 : 0.5)
            .frame(width: 20, height: 20, alignment: .center)
            .shadow(color: .white, radius: isOpen ? 30 : 0, x: 0, y: 0)
    }
    // 开关
    func switchBtn() -> some View {
        VStack(spacing: 20) {
            Image(systemName: "power")
                .foregroundColor(isOpen ? .white : .black)
                .font(.system(size: 32))
                .onTapGesture {
                    self.isOpen.toggle()
                }
            Text(isOpen ? "点击关灯" : "点击开灯")
                .font(.system(size: 17))
                .fontWeight(.bold)
                .foregroundColor(isOpen ? .white : .black)
        }.padding(.bottom, 80)
    }
}



相关文章
|
2月前
|
API C# 开发工具
使用C#实现客厅电灯的开关
使用C#实现客厅电灯的开关
17 0
|
7月前
|
网络协议 Go 网络安全
一种远程升级PLC和HMI组态屏程序的方法-做个笔记
一种远程升级PLC和HMI组态屏程序的方法-做个笔记
118 2
|
前端开发 JavaScript
与众不同的夜间开关交互效果
与众不同的夜间开关交互效果
82 0
|
监控 安全 物联网
一款多功能露营专用氛围灯
一、主要功能 使用COB灯丝+3D打印构建精妙的螺旋线条露营灯 选用IP5328P作为电源主控,支持双向PD快充,支持PPS档位输出 电池仓结构设计兼容26650(不可更换)或21700/18650(可更换)电池 使用WS2812灯组成顶部灯圈,可以实现照明灯+氛围灯的双重功能 通过STM32与5328进行iic通信,获取充放电数据,并通过BLE透传 通过BLE与手机APP连接,实现对“萤辉”的掌上控制(目前存在一定bug) 二、硬件说明 请注意,本项目一共有4片PCB,其中两片4层板,两片2层板(均在10*10以内可以免费打样) 硬件说明将会根据PCB编写,以便对电路设计进
123 0
|
算法 编译器
开源:智能宠物弹射喂食器连载贴之步进电机控制(二)
开源:智能宠物弹射喂食器连载贴之步进电机控制(二)
250 0
摇杆控制移动自动瞄准射击如何实现?
前言 这篇教程实现了射击游戏中的摇杆控制移动以及自动瞄准射击功能,并提供一个示例项目的模版。
138 0
|
程序员 异构计算
FPGA项目一:1位闪烁灯设计(下 )
FPGA项目一:1位闪烁灯设计
282 0
FPGA项目一:1位闪烁灯设计(下 )
|
机器学习/深度学习 芯片 异构计算
FPGA项目一:1位闪烁灯设计(上)
FPGA项目一:1位闪烁灯设计
217 0
FPGA项目一:1位闪烁灯设计(上)
|
芯片
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
743 0
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
|
存储 编解码 关系型数据库
案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
基于Qt的真空焊接系统工程机械案例分享。1.ui由本司美工承担设计,显示分辨率1280 x 1024,同时支持鼠标操作。2.权限控制:三种权限,分为管理员(可以定制模块界面,修改产品名称等定制化软件和其他权限,同时具备编程员和操作员权限),编程员(新建工件,参数,调试功能等与生产相关的权限,同时具备操作员权限),操作员(加工相关的操作权限),三个等级对所有界面进行区分使用,并可进行管理;3.专家可增删改编程员,操作员;编程员可增删改操作员;4.与西门子PLC通讯,兼容S7全系,项目使用S7-1500...
案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
下一篇
DataWorks