每次都要写一堆样式代码?试试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

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

快来动手试试吧。

相关文章
文本,提升编程能力的方法-----代码库,能够完全显示代码,能够容纳一个完整的代码文件,左侧能够呈现代码
文本,提升编程能力的方法-----代码库,能够完全显示代码,能够容纳一个完整的代码文件,左侧能够呈现代码
|
6月前
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
|
6月前
|
前端开发
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
ElementPlus卡片如何能够一行呈四,黑马UI前端布局视频资料,element样式具体的细节无法修改,F12找到那个位置,可能在其他组件写了错误,找到那个位置,围绕着位置解决问题最快了,卡片下边
犯的一个bug粗心错误-common的样式重复书写了,导致怎么也无法修改样式,导致样式怎么也写不好,还得信息哦
犯的一个bug粗心错误-common的样式重复书写了,导致怎么也无法修改样式,导致样式怎么也写不好,还得信息哦
|
8月前
|
缓存 NoSQL 数据库
总结 做项目的一点自己的想法 在开发中我觉得可以修改的地方
总结 做项目的一点自己的想法 在开发中我觉得可以修改的地方
41 1
|
小程序 索引
|
前端开发
前端工作总结131-优化项目的代码显示名字
前端工作总结131-优化项目的代码显示名字
108 0
前端工作总结131-优化项目的代码显示名字
|
前端开发
前端工作总结108-修改新增按钮显示逻辑
前端工作总结108-修改新增按钮显示逻辑
120 0
前端工作总结108-修改新增按钮显示逻辑
|
JavaScript 算法 前端开发
【前端】持续总结一下Vue书写规范,包含了元素,组件,注释,指令等
总结一下Vue书写规范,包含了元素,组件,注释,指令等
268 0
|
JSON 算法 前端开发
你还在重复编写表单代码吗?封装一个组件不香吗?
🎈表单是我们平时在很多情况下都会用到的,那么重复的编写表单代码会不会让你感到厌烦呢?如果将其封装成一个可配置组件的话是不是会减少我们很多的工作量。
166 0
你还在重复编写表单代码吗?封装一个组件不香吗?

热门文章

最新文章