0
点赞
收藏
分享

微信扫一扫

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

在本章中,你将学会使用​​SwiftUI​​​搭建一个开关灯​​App​​。

项目背景

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

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

说干就干。

项目搭建

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

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

背景卡片

首先是背景部分,我们可以使用​​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​​给矩形加了边距。

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

页面标题

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

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

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

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

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

灯视图

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

@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​​的状态和透明度、阴影修饰符的作用,构建了开灯时的样式及关闭时的样式。

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

开关按钮

然后是开关按钮,我们使用​​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​​处于关闭状态时,文字提示“点击开灯”。

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

整体布局

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

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

项目展示

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

本章代码

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)
}
}

恭喜你,完成了整个项目的全部内容!

快来动手试试吧。

如果本专栏对你有帮助,不妨点赞、评论、关注~

举报

相关推荐

0 条评论