每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧

简介: 每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧

每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧


项目背景

有一天UI跑过来指着App页面说:

你看两个同样的按钮,这一个按钮线段和第二个按钮线段为什么会不一样?

翻查代码后才看到,原来复制样式代码的时候少复制了一行,有点尴尬。

经过这次事情我假装反思了一下,是不是应该和UI设计一样,有一些在系统中统一的样式应该要建立一个统一的样式库,这样就不用每次复制那么多样式代码了?

说干就干。

项目搭建

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

image.png

基础样式

我们先来看看基础的样式是如何设计的,我们先来做一个简单的文字按钮,示例:

struct ContentView: View {
    var body: some View {
        Text("文如秋雨")
            .font(.system(size: 17))
            .foregroundColor(.white)
            .padding()
            .background(Color.blue)
            .clipShape(Capsule())
    }
}
image.png

上述代码中,我们可以看到文字按钮的常见修饰符:font字体修饰符、foregroundColor字体颜色修饰符、padding边距修饰符、background背景颜色修饰符、clipShape形状绘制修饰符。

视图修饰器

如果App中的主要按钮都使用这种样式,我们就可以把修饰符部分抽离出来,构建一个ViewModifier视图修饰器。代码结构如下:

struct MainTitle: ViewModifier {
    func body(content: Content) -> some View {
        content
           //修饰符
    }
}

上述代码中,我们将原来给Text文字按钮的修饰符抽离构建成一个新的视图修饰器MainTitle,我们的文字按钮修饰符将修饰content,示例:

struct MainTitle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(.system(size: 17))
            .foregroundColor(.white)
            .padding()
            .background(Color.blue)
            .clipShape(Capsule())
    }
}

当我们要使用时,只需要调用modifier修饰符,示例:

struct ContentView: View {
    var body: some View {
        Text("文如秋雨")
            .modifier(MainTitle())
    }
}

image.png

如果我们要更加优雅点,想要像修饰符一样调用ViewModifier视图修饰器,也可以做一些拓展,示例:

extension View {
    func mainTitle() -> some View {
        self.modifier(MainTitle())
    }
}
这样我们给Text添加修饰符时,就可以直接使用mainTitle视图,示例:
css
复制代码
struct ContentView: View {
    var body: some View {
        Text("文如秋雨")
            .mainTitle()
    }
}

修饰器作用

可能一个按钮看不出效果,我们建立多一个按钮看看:

struct ContentView: View {
    var body: some View {
        VStack(spacing:15){
            Text("文如秋雨")
                .mainTitle()
            Text("文如秋雨")
                .mainTitle()
            Text("文如秋雨")
                .mainTitle()
            Text("文如秋雨")
                .mainTitle()
        }
    }
}

image.png当我们应用内不同的页面使用同一个按钮样式时,我们如果要统一修改样式,就只需要修改ViewModifier视图修饰器,示例:

struct MainTitle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .frame(maxWidth:.infinity)
            .font(.system(size: 17))
            .foregroundColor(.white)
            .padding()
            .background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.green]), startPoint: .leading, endPoint: .trailing))
            .cornerRadius(8)
            .padding(.horizontal)
    }
}

image.png

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

快来动手试试吧。

相关文章
|
4月前
|
存储 前端开发 UED
动态样式问题之客户端进行样式复用如何解决
动态样式问题之客户端进行样式复用如何解决
29 0
文本,提升编程能力的方法-----代码库,能够完全显示代码,能够容纳一个完整的代码文件,左侧能够呈现代码
文本,提升编程能力的方法-----代码库,能够完全显示代码,能够容纳一个完整的代码文件,左侧能够呈现代码
|
5月前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
34 0
|
5月前
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
|
5月前
|
前端开发
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
犯的一个bug粗心错误-common的样式重复书写了,导致怎么也无法修改样式,导致样式怎么也写不好,还得信息哦
犯的一个bug粗心错误-common的样式重复书写了,导致怎么也无法修改样式,导致样式怎么也写不好,还得信息哦
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
前端开发
前端工作总结131-优化项目的代码显示名字
前端工作总结131-优化项目的代码显示名字
102 0
前端工作总结131-优化项目的代码显示名字
|
前端开发
前端工作总结193-验证放在直接父级
前端工作总结193-验证放在直接父级
76 0
前端工作总结193-验证放在直接父级
|
JSON 算法 前端开发
你还在重复编写表单代码吗?封装一个组件不香吗?
🎈表单是我们平时在很多情况下都会用到的,那么重复的编写表单代码会不会让你感到厌烦呢?如果将其封装成一个可配置组件的话是不是会减少我们很多的工作量。
157 0
你还在重复编写表单代码吗?封装一个组件不香吗?