当前位置: 首页 > news >正文

自定义 SwiftUI 中符号图像的外观

在这里插入图片描述

在这里插入图片描述

文章目录

    • 前言
    • 大小
    • 颜色
    • 渲染模式
      • 单色
      • 分层
      • 调色板
      • 多色
    • 可变值
    • 设计变体
    • 示例代码
      • 结论

前言

符号图像是来自 Apple的SF Symbols 库的矢量图标,设计用于在 Apple 平台上使用。这些可缩放的图像适应不同的大小和重量,确保在我们的应用程序中具有一致的高质量图标。在 SwiftUI 中使用符号图像非常简单,只需使用 Image 视图和所需符号的系统名称。下面是一个快速示例:

import SwiftUIstruct ContentView: View {var body: some View {Image(systemName: "star")}
}

在这里插入图片描述

大小

尽管符号被放置在Image视图中,但它应被视为文本。要调整符号的大小,我们可以应用 font() 修饰符,就像在Text视图中一样。这使我们能够将符号的大小与不同的文本样式对齐,确保UI的视觉一致性。

HStack {Image(systemName: "star").font(.title)Image(systemName: "star").font(.body)Image(systemName: "star").font(.caption)
}

在这里插入图片描述

我们可以使用 fontWeight() 修饰符来调整符号的重量。这个修饰符改变符号笔画的粗细,使我们能够将符号与周围的文本匹配或对比。

HStack {Image(systemName: "star").fontWeight(.light)Image(systemName: "star").fontWeight(.bold)Image(systemName: "star").fontWeight(.black)
}

在这里插入图片描述

要根据字体大小相对缩放图像,我们应该使用 imageScale() 修饰符。有三个选项:小、中、大,它们根据字体大小按比例缩放符号。如果没有明确设置字体,符号将从当前环境中继承字体。

HStack {Image(systemName: "star").imageScale(.small)Image(systemName: "star").imageScale(.medium)Image(systemName: "star").imageScale(.large)
}
.font(.headline)

在这里插入图片描述

不建议通过应用resizable()修饰符并设置框架来调整符号图像的大小,因为这样做会使图像停止作为符号图像,从而影响其与文本的布局和对齐。

颜色

使用SwiftUI中的foregroundStyle()视图修饰符,可以轻松自定义符号图像的颜色。这个修饰符允许我们直接设置符号图像的颜色。

Image(systemName: "star").foregroundStyle(.orange)

在这里插入图片描述

foregroundStyle() 修饰符可以采用任何 ShapeStyle,包括渐变,这为我们的符号图像提供了广泛的自定义可能性。在这个例子中,星形符号使用了从黄色到红色的线性渐变,从顶部到底部过渡。

Image(systemName: "star").foregroundStyle(LinearGradient(colors: [.yellow, .red],startPoint: .top,endPoint: .bottom))

在这里插入图片描述

渲染模式

我们可以通过使用不同的渲染模式进一步自定义符号图像的外观。SF Symbols有四种不同的渲染模式,这些模式会改变符号的颜色和外观。一些渲染模式使整个图标保持相同颜色,而其他模式则允许多种颜色。

要在SwiftUI中设置符号图像的首选渲染模式,我们使用 symbolRenderingMode() 修饰符。

单色

单色是默认的渲染模式。在这种模式下,符号的每一层都是相同的颜色。

Image(systemName: "thermometer.snowflake").symbolRenderingMode(.monochrome)

在这里插入图片描述

分层

分层模式将符号渲染为多个层,每层应用不同的不透明度。层次结构和不透明度在每个符号中是预定义的,但我们仍然可以使用 foregroundStyle() 修饰符自定义颜色。

HStack {Image(systemName: "thermometer.snowflake")Image(systemName: "thermometer.snowflake").foregroundStyle(.indigo)
}
.symbolRenderingMode(.hierarchical)

symbolRenderingMode() 修饰符既可以直接应用于图像视图,也可以通过将其应用于包含多个符号图像的父视图来在环境中设置。这样,父元素内的所有符号图像都会受到影响。

在这里插入图片描述

调色板

调色板模式允许符号以多层呈现,每层具有不同的颜色。这种模式非常适合创建色彩丰富的多层图标。

Image(systemName: "thermometer.snowflake").symbolRenderingMode(.palette).foregroundStyle(.blue, .teal, .gray)

我们不需要显式地指定调色板呈现模式。如果我们在 foregroundStyle() 修饰符中应用多个样式,则调色板模式将自动激活。

Image(systemName: "thermometer.snowflake").foregroundStyle(.blue, .teal, .gray)

在这里插入图片描述

如果我们为一个定义了三个层次结构的符号指定两种颜色,那么第二层和第三层将使用相同的颜色。

Image(systemName: "thermometer.snowflake").foregroundStyle(.blue, .gray)

在这里插入图片描述

多色

多色模式使用由 Apple 定义的一组固定颜色渲染符号。在使用多色渲染时,我们无法自定义符号的颜色,它将使用预定义的颜色。

HStack {Image(systemName: "thermometer.snowflake")Image(systemName: "thermometer.sun.fill")
}
.symbolRenderingMode(.multicolor)

在这里插入图片描述

值得注意的是,由于这些颜色是固定的,它们不适应明暗模式。例如,我们的温度计符号具有白色轮廓,在白色背景上是不可见的。

并非所有符号都支持每种呈现模式。图层较少的符号在不同模式下看起来可能相同,分层和调色板模式看起来类似于单色。

可变值

在 SwiftUI 中显示符号图像时,我们可以提供一个 0.0 到 1.0 之间的可选值,渲染的图像可以使用它来自定义外观。如果符号不支持可变值,此参数无效。我们应该在 SF Symbols 应用程序中检查哪些符号支持可变值。

HStack {Image(systemName: "speaker.wave.3", variableValue: 0)Image(systemName: "speaker.wave.3", variableValue: 0.3)Image(systemName: "speaker.wave.3", variableValue: 0.6)Image(systemName: "speaker.wave.3", variableValue: 0.9)
}

在这里插入图片描述

可变值可以表示一个随着时间变化的特性,例如容量或强度。这使得符号的外观可以根据应用程序的状态动态变化。

struct ContentView: View {@State private var value = 0.5var body: some View {VStack {Image(systemName: "speaker.wave.3",variableValue: value)Slider(value: $value, in: 0...1).padding()}.padding()}
}

在这个例子中,符号 speaker.wave.3 根据 Slider 提供的值改变其外观。

在这里插入图片描述

我们应该使用可变值来传达状态的变化,例如音量、电池电量或信号强度,为用户提供动态状态的清晰视觉表示。为了传达深度和视觉层次,我们应该使用分层渲染模式,它可以提升某些图层,并区分符号内的前景和背景元素。

设计变体

符号可以有不同的设计变体,例如填充和斜杠,以帮助传达特定的状态和操作。斜杠变体可以表示项目或操作不可用,而填充变体可以表示选择。

在 SwiftUI 中,我们可以使用 symbolVariant() 修饰符来应用这些变体。

HStack {Image(systemName: "heart")Image(systemName: "heart").symbolVariant(.slash)Image(systemName: "heart").symbolVariant(.fill)
}

在这里插入图片描述

不同的符号变体用于各种设计目的。轮廓变体在工具栏、导航栏和列表中非常有效,而填充变体则用于强调选择的状态。

HStack {Image(systemName: "heart").symbolVariant(.circle)Image(systemName: "heart").symbolVariant(.square)Image(systemName: "heart").symbolVariant(.rectangle)
}

在这里插入图片描述

不同的符号变体具有不同的设计用途。轮廓变体在工具栏、导航栏和列表中非常有效,因为这些地方通常会与文本一起显示符号。将符号封装在圆形或方形等形状中可以增强其可读性,特别是在较小尺寸下。填充变体由于其实心区域,使符号更具视觉强调性,非常适合用于 iOS 标签栏、滑动操作以及指示选择的强调颜色场景。

在许多情况下,显示符号的视图会自动选择合适的变体。例如,iOS 标签栏通常使用填充变体,而导航栏则偏好轮廓变体。这种自动选择确保符号在不同上下文中有效使用,而无需明确指定。

示例代码

import SwiftUIstruct ContentView: View {@State private var value = 0.5var body: some View {VStack {Image(systemName: "speaker.wave.3",variableValue: value).symbolRenderingMode(.hierarchical).foregroundStyle(.blue)Slider(value: $value, in: 0...1).padding()}.padding()}
}

运行 Demo

  1. 打开Xcode并创建一个新的 SwiftUI 项目。
  2. 将上述代码粘贴到 ContentView.swift 文件中。
  3. 运行项目,查看效果。

结论

在SwiftUI中增强符号图像可以显著改善应用程序的外观和感觉。通过调整大小、颜色、渲染模式、可变值和设计变体,我们可以创建使应用程序更直观和视觉吸引力的图标。SwiftUI使这些调整变得简单易行,使我们能够轻松实现和改进这些自定义以提供更好的用户体验。

相关文章:

自定义 SwiftUI 中符号图像的外观

文章目录 前言大小颜色渲染模式单色分层调色板多色 可变值设计变体示例代码结论 前言 符号图像是来自 Apple的SF Symbols 库的矢量图标,设计用于在 Apple 平台上使用。这些可缩放的图像适应不同的大小和重量,确保在我们的应用程序中具有一致的高质量图标…...

循环神经网络和自然语言处理一

目录 一.分词 1.分词工具 2.分词的方法 3.N-gram表示方法 二.向量化 1.one-hot编码 2.word embedding 3.word embedding API 4.数据形状改变 既然是自然语言,那么就有字,词,句了 一.分词 1.分词工具 tokenization,jie…...

CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮

本例图片 案例分析 其实这个按钮非常的简单啊,主要就是利用了box-shadow的inset。 布局代码 <button class="base">凹下的按钮</button> 基础样式 :root{--main-bg-color: #dcdcdc; /* 将页面背景色调整为浅灰色 */--color:#000;--hover-color:#99…...

20240807 每日AI必读资讯

&#x1f468;‍&#x1f4bc;马斯克再发难、OpenAI 高层巨变&#xff1a;两大核心人物离职&#xff0c;总裁休长假到年底 - OpenAI 联合创始人 John Schulman 官宣离职&#xff0c;加入原是竞品公司的 Anthropic - 陪伴 OpenAI 共同成长 9 年的总裁兼联合创始人 Greg Brockm…...

海外社媒账号如何让防关联?账号隔离的5大要点

在跨境电商迅速发展和全球化营销的背景下&#xff0c;海外社交媒体平台成为外贸人拓展市场的关键阵地。因此&#xff0c;为了保障账号安全&#xff0c;实现高效推广&#xff0c;账号隔离以及安全防关联对外贸人来说至关重要。本文将盘点引起海外社媒账号关联的原因及其五大解决…...

下一代 AI 搜索引擎 MindSearch:多智能体 + 系统2,模拟人类认知过程的 AI 搜索引擎

下一代 AI 搜索引擎 MindSearch&#xff1a;多智能体 系统2&#xff0c;模拟人类认知过程的 AI 搜索引擎 提出背景解法拆解实验评估开放集封闭集问答 论文大纲怎么进一步改进 MindSearch&#xff1f;1. 组合&#xff08;Combination&#xff09;2. 拆开&#xff08;Disassembl…...

一键生成专业PPT:2024年AI技术在PPT软件中的应用

不知道你毕业答辩的时候有没有做过PPT&#xff0c;是不是也被这个工具折磨过。没想到现在都有AI生成PPT的工具了吧&#xff1f;这次我就介绍几款可以轻松生成PPT的AI工具吧。 1.笔灵AIPPT 连接直达&#xff1a;​​​​​​​https://ibiling.cn/ppt-zone 这个工具我最早是…...

Godot学习笔记8——PONG游戏制作

目录 一、小球 二、地图 三、积分系统 四、玩家场景 五、导出与发布 PONG是1972年由雅达利公司推出的游戏&#xff0c;主要玩法为玩家控制两个可以上下移动的板子击打屏幕中不断运动的球 一、小球 我们首先创建一个“Area2D”场景&#xff0c;在它下方创建“Collisi…...

软件RAID配置实战(2个案例场景)

文章目录 3、软件RAID管理-mdadm工具安装mdadm组件格式示例选项说明mdadm命令其它常用选项 4、相关查询命令查看创建RAID的进度查看RAID磁盘详细信息查看文件系统的磁盘空间使用情况 5、RAID配置示例场景1&#xff1a;RAID5步骤 场景2&#xff1a;RAID10步骤 6、移除RAID阵列 接…...

# 基于MongoDB实现商品管理系统(2)

基于MongoDB实现商品管理系统&#xff08;2&#xff09; 基于 mongodb 实现商品管理系统之准备工作 1、案例需求 这里使用的不是前端页面&#xff0c;而是控制台来完成的。 具体的需求如下所示&#xff1a; 运行 查询所有 通过id查询详情 添加 - 通过id删除 2、案例分析 程…...

国标GB28181视频平台LntonCVS视频融合共享平台视频汇聚应用方案

近年来&#xff0c;国内视频监控应用迅猛发展&#xff0c;系统接入规模不断扩大&#xff0c;导致了大量平台提供商的涌现。然而&#xff0c;不同平台的接入协议千差万别&#xff0c;使得终端制造商不得不为每款设备维护多个不同平台的软件版本&#xff0c;造成了资源的严重浪费…...

java基础I/O

1,I/O流的概念&#xff1a; IO流代表的是一个数据输入的源或者输出的目标地址&#xff0c;可以是硬盘&#xff0c;内存&#xff0c;网络或者什么其他的电子设备&#xff0c;而IO流的类型也很多比如最简单的字节或者字符&#xff0c;或者其他更高级的对象。 不管它有多少特性&am…...

关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论

关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论&#xff0c;确实是一个值得深入探讨的话题。这里&#xff0c;“八股文”通常指的是面试中常见的一系列标准化问题和答案&#xff0c;涵盖了编程语言基础、算法、数据结构、设计模式、框架知识等&#xff0c;这些内…...

【算法设计题】基于front、rear和count的循环队列初始化、入队和出队操作,第6题(C/C++)

目录 第3题 基于front、rear和count的循环队列初始化、入队和出队操作 得分点&#xff08;必背&#xff09; 题解&#xff1a;基于front、rear和count的循环队列初始化、入队和出队操作 数据结构定义 代码解答 详细解释 1. 循环队列初始化 2. 循环队列入队 3. 循环队列…...

端点区间影响

前言&#xff1a;这一题本来想就是直接来一个前缀和来写&#xff0c;直接左边加一&#xff0c;右边减一&#xff0c;但是细想好像有问题&#xff0c;我们平时做的题目左边端点造成的影响会对这一段区间造成影响&#xff0c;但是这一题的话超过了左边端点就不会有影响了 那这一题…...

Leetcode3224. 使差值相等的最少数组改动次数

Every day a Leetcode 题目来源&#xff1a;3224. 使差值相等的最少数组改动次数 解法1&#xff1a; 想一想&#xff0c;什么情况下答案是 0&#xff1f;什么情况下答案是 1&#xff1f; 如果答案是 0&#xff0c;意味着所有 ∣nums[i]−nums[n−1−i]∣ 都等于同一个数 X。…...

thinkphp之命令执行漏洞复现

实战&#xff1a; fofa搜索thinkphp-- 第一步&#xff1a;先在dns平台上&#xff0c;点击Get SubDomain &#xff0c;监控我们的注入效果 返回dnslog查看到了Java的版本信息 打开kali监听端口 进行base64编码 bash -i >& /dev/tcp/192.168.189.150/8080 0>&1 …...

算法板子:匈牙利算法——二分图的最大匹配

目录 1. 基础概念 &#xff08;1&#xff09;二分图的概念 &#xff08;2&#xff09; 匈牙利算法的作用 2. 代码 1. 基础概念 &#xff08;1&#xff09;二分图的概念 顶点集 V 分为两个集合&#xff0c;且图中每条边依附的两个顶点都分属于这两个子集&#xff0c;也就是第…...

轻松拯救数据危机!四大必备的数据恢复软件免费版推荐!

不论是珍贵的家庭照片、重要的工作文档还是个人的私密信息&#xff0c;一旦丢失&#xff0c;后果不堪设想。今天&#xff0c;给大家介绍四款强大的数据恢复大师免费版&#xff0c;帮助大家在数据丢失时挽回损失。 Foxit数据恢复大师 点此免费下载&#xff1a;www.pdf365.cn/f…...

windbg常用命令

1. 基本调试命令 1.1启动和附加 windbg -pn : 按进程名称启动调试。 windbg -p : 按进程 ID 启动调试。 1.2 控制执行 g: 继续执行程序。 p: 单步执行&#xff0c;不进入函数。 t: 单步执行&#xff0c;进入函数。 bp <Address>: 在指定地址设置断点。 bl: 列出所有断…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...