本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

Eul 是一款 SwiftUI & Combine 教程 App(iOS、macOS),以文章(文字、图片、代码)配合真机示例(Xcode 12+、iOS 14+,macOS 11+)的形式呈现给读者。笔者意在尽可能使用简洁明了的语言阐述 SwiftUI & Combine 相关的知识,使读者能快速掌握并在 iOS 开发中实践。

自定义 Modifier

SwiftUI 提供了许多内建的 Modifier(修饰器),我们可以方便地调用。但是系统提供的有一定的局限性,如果我们需要自定义 Modifier,该如何实现呢?

设想有如下需求场景:在某个用户的名字右边,如果他是 Vip,显示 Vip 标识,如果不是,显示开通会员的按钮。如果我们能自定义一个 isVip 这样的 Modifier 可以方便的调用和展示差异化视图,那该是极好的。

首先,我们要实现自定义的 Modifier,需要实现 ViewModifier 协议:

struct Vip: ViewModifier {
let isVip: Bool func body(content: Content) -> some View {
HStack {
content
if isVip {
Text("Vip")
.font(.caption).bold()
.foregroundColor(.white)
.padding(3)
.background(Color.orange)
.cornerRadius(3)
} else {
Button {
// action
} label: {
Text("开通会员")
.font(.caption)
.foregroundColor(.white)
.padding(5)
.background(Color.blue)
.clipShape(Capsule())
}
.buttonStyle(BorderlessButtonStyle())
}
}
}
}

.buttonStyle(BorderlessButtonStyle()) 的作用是为了让按钮在列表中,只有按钮可以响应点击事件。

然后我们给 View 添加扩展:

extension View {
func isVip(_ isVip: Bool) -> some View {
self.modifier(Vip(isVip: isVip))
}
}

接下来我们就可以方便的使用了:

Text("Bruce").isVip(false)
// 或
Text("Bruce").isVip(true)

本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

SwiftUI 简明教程之自定义 Modifier的更多相关文章

  1. SwiftUI 简明教程之文本与图片

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程类 App(iOS.macOS),以文章(文字.图片 ...

  2. SwiftUI 简明教程之指示器

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...

  3. SwiftUI 简明教程之属性包装器

    本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...

  4. SwiftUI 官方教程(二)

    SwiftUI 官方教程(二) 2. 自定义 Text View 为了自定义 view 的显示,我们可以自己更改代码,或者使用 inspector 来帮助我们编写代码. 在构建 Landmarks 的 ...

  5. Java8简明教程(转载)

    ImportNew注:有兴趣第一时间学习Java 8的Java开发者,欢迎围观<征集参与Java 8原创系列文章作者>. 以下是<Java 8简明教程>的正文. “Java并没 ...

  6. HTML简明教程(二)

    HTML简明教程(二) 一.HTML 图像 二.HTML 表格 三.HTML 列表 四.HTML div和 span 五.HTML 布局 六.HTML 表单和输入 七.HTML 框架 八.HTML内联 ...

  7. Qemu下安装Sun Solairs8简明教程 转

    http://blog.csdn.net/stonesharp/article/details/8928393 Qemu下安装Sun Solairs8简明教程(Centos6. / Win7) 作者: ...

  8. iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)

    Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很 ...

  9. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

随机推荐

  1. jQuery学习笔记(1) 初识jQuery

    目录 目录 引用 注意 HelloWorldHelloWorld! jQueryjQuery对象和DOMDOM对象的相互转换 冲突的解决 引用 本地文件引用: <script src=" ...

  2. 2.掌握numpy数组

    一.改变数组形态 reshape()--通过改变数组的维度改变数组形态 import numpy as np Array=np.arange(1,17,1) Array Array_1=np.aran ...

  3. SpEL表达式注入

    一.内容简介 Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图.语言语法类似于Unified EL,但提供了额外的功能,特别是方 ...

  4. P1739_表达式括号匹配(JAVA语言)

    思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...

  5. 攻防世界 reverse serial-150

    serial-150 suctf-2016 直接使用ida发现main函数中夹杂大片数据,应该是自修改代码,动态调试: 调试中发现,输入为16位,验证方法为:从头开始取一字符进行比较,比较通过检验后, ...

  6. [Fundamental of Power Electronics]-PART II-7. 交流等效电路建模-7.3 脉冲宽度调制器建模

    7.3 脉冲宽度调制器建模 我们现在已经达成了本章开始的目标,为图7.1推导了一个有效的等效电路模型.但仍存在一个细节,对脉冲宽度调制(PWM)环节进行建模.如图7.1所示的脉冲宽度调制器可以产生一个 ...

  7. 阅读作业2&CI/CD调研

    说明 项目 内容 这个作业属于哪个课程 2021春季软件工程 (罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 初步获得软件工程师的能力 这个作业在哪个具体方面帮助我实现目 ...

  8. 消息中间件-RabbitMQ消息可靠性和插件化机制

    package com.study.rabbitmq.a132.confirm; import com.rabbitmq.client.*; import java.io.IOException; i ...

  9. Kubernetes部署metrics-server提示健康检测报错500,简单解决方式

    为什么写? 最近有项目要用到HPA(Horizontal Pod Autoscaler)依赖了k8s的 metrics 指标才能做出自动缩扩容的动作,我这边用官方GitHub v0.4.2版本启动不起 ...

  10. HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)

    HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入) 目录 1. JWT密钥混淆 2. 环境 3. Challenge 4. Walkthrough 1 ...