news 2026/8/2 22:56:03

LaTeX子图排版完全指南:subcaption宏包实战与避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LaTeX子图排版完全指南:subcaption宏包实战与避坑

1. 项目概述:为什么我们需要subfloat

在撰写技术报告、学术论文或者任何需要图文并茂的文档时,我们常常会遇到一个场景:需要将多张相关的图片或子图组合在一起,作为一个逻辑上的整体进行展示和引用。比如,你可能想展示一个算法的三个不同阶段的输出结果,或者对比同一组数据在不同参数下的可视化效果。在 LaTeX 中,最基础的图文排版工具是figure环境和\includegraphics命令,但它们一次只能处理一张图。如果你简单地将三张图并排放置,它们会成为三个独立的浮动体,拥有各自的编号(如图1,图2,图3),这破坏了它们之间的逻辑关联性,引用起来也非常不便。

这时,subfloat(通常通过subfigsubcaption宏包提供)就成为了解决这个痛点的利器。它允许你在一个主figure环境内,创建多个带有独立子编号(如 (a), (b), (c))的子图。你可以为每个子图单独添加简短的标题(子标题),同时为整个组合图添加一个总标题。在正文中,你可以引用整个图(如“如图1所示”),也可以精确地引用其中的某个子图(如“如图1(a)所示”)。这不仅使得排版整洁、专业,更重要的是,它极大地增强了文档的逻辑性和可读性。

我见过很多初学者,包括早期的我自己,会用各种“土办法”来拼凑子图,比如用图像处理软件把多张图合成一张,或者在 LaTeX 里用minipage手动模拟。前者失去了矢量图的清晰度和后期修改的灵活性;后者则无法实现自动的子图编号和引用,维护起来是一场噩梦。subfloat正是为了优雅地解决这些问题而生的。接下来,我将深入拆解它的使用,从宏包选择、基础语法到高级技巧和避坑指南,让你能真正掌握这个强大工具。

2. 核心工具选型:subfigvssubcaption

在 LaTeX 中实现子图功能,主要有两个流行的宏包:subfigsubcaption。选择哪一个,是上手第一步就需要明确的。这不仅仅是语法上的细微差别,更关系到与文档中其他宏包(尤其是captionhyperref)的兼容性,以及最终排版效果的精细控制。

2.1subfig宏包:经典但需谨慎

subfig是一个历史悠久的宏包,功能稳定且强大。它提供了\subfloat命令,这也是本文标题的直接来源。

基本用法示例:

\usepackage{subfig} ... \begin{figure}[htbp] \centering \subfloat[子图A的简短说明]{\includegraphics[width=0.45\linewidth]{figA.pdf}\label{fig:subA}} \hfill \subfloat[子图B的简短说明]{\includegraphics[width=0.45\linewidth]{figB.pdf}\label{fig:subB}} \caption{这里是整个组合图的总标题。} \label{fig:main} \end{figure}

它的优点:

  1. 语法直观\subfloat[...]{...}的结构非常清晰,中括号内是子标题,大括号内是子图内容。
  2. 引用灵活:可以使用\ref{fig:subA}来引用子图 (a),使用\ref{fig:main}来引用整个图1。
  3. 列表支持:在图表目录中,可以配置是否列出子图。

然而,它有一个显著的缺点:兼容性问题。subfig与另一个非常常用的宏包caption(用于自定义标题格式)存在已知的冲突。同时,在与hyperref(用于生成超链接)配合使用时,也可能需要额外的配置才能让子图的引用链接正常工作。对于现代 LaTeX 文档,尤其是使用了复杂格式模板的论文,这种潜在的冲突会增加不必要的调试成本。

注意:如果你使用的模板明确要求或已经加载了subfig,那么遵循模板即可。但在开始一个新项目时,我通常更推荐下面这个更现代的替代品。

2.2subcaption宏包:现代推荐之选

subcaption宏包可以看作是subfig的现代化替代和增强。它被设计为与caption宏包完美兼容,并且通常能更好地与hyperref协同工作。它提供了subfigure环境(注意是subfigure不是subfloat)。

基本用法示例:

\usepackage{caption} \usepackage{subcaption} ... \begin{figure}[htbp] \centering \begin{subfigure}[b]{0.45\linewidth} \centering \includegraphics[width=\textwidth]{figA.pdf} \caption{子图A的简短说明} \label{fig:subA} \end{subfigure} \hfill \begin{subfigure}[b]{0.45\linewidth} \centering \includegraphics[width=\textwidth]{figB.pdf} \caption{子图B的简短说明} \label{fig:subB} \end{subfigure} \caption{这里是整个组合图的总标题。} \label{fig:main} \end{figure}

它的核心优势:

  1. 完美兼容:与caption宏包无缝集成,你可以使用caption的所有强大功能(如字体、间距、悬挂缩进等)来统一设置主标题和子标题的样式。
  2. 环境化语法subfigure是一个完整的环境,你可以在其中进行更复杂的排版,比如在图片下方再添加一段文字或公式,这比\subfloat的单命令形式更灵活。
  3. 更少的冲突:大大降低了与hyperref等其他宏包冲突的概率。

实操心得:在我近五年的 LaTeX 写作中,只要不是维护遗留文档,我几乎无一例外地选择subcaption。它的学习曲线和subfig几乎一样平缓,但避免了后期可能出现的令人头疼的兼容性问题。特别是当你需要精细调整标题格式时,caption+subcaption的组合提供了无与伦比的控制力。因此,对于新项目,强烈建议从subcaption开始。下文的主要讲解也将基于subcaption宏包。

3. 从零开始:一个完整的子图排版实例

让我们通过一个具体的、可复现的例子,来详细拆解使用subcaption排版子图的每一个步骤和细节。假设我们要在一个图里展示三种不同的函数曲线:正弦、余弦和正切。

3.1 文档前期准备与宏包加载

首先,你需要一个可编译的 LaTeX 文档基础框架。我推荐使用article文档类,因为它简单通用。

\documentclass{article} \usepackage{graphicx} % 必须:插入图片 \usepackage{caption} % 强烈推荐:用于标题样式控制 \usepackage{subcaption} % 核心:子图功能 % 可选但推荐的宏包 \usepackage{amsmath} % 提供更好的数学公式支持,可能在标题或图中用到 \usepackage{hyperref} % 生成可点击的交叉引用链接,需最后加载之一 \usepackage{blindtext} % 仅用于生成示例文本,实际写作中不需要 \begin{document} \blindtext % 这是一些占位文本,用于查看浮动体位置 % 我们的图形将放在这里 \blindtext % 更多占位文本 \end{document}

关键点解析:

  • graphicx是插入图片的基石,没有它\includegraphics命令无法工作。
  • captionsubcaption通常一起加载。subcaption会自动处理对caption的依赖,但显式声明是个好习惯。
  • hyperref宏包必须在绝大多数其他宏包之后加载(subcaption的文档特别说明了兼容性,通常放在它之后没问题),以确保交叉引用能正确生成超链接。一个常见的顺序是把hyperref放在subcaption之后,但在\begin{document}之前。
  • 图片文件格式:LaTeX 原生支持.pdf,.png,.jpg等格式。对于包含文字、线条的图表(如函数图、流程图),优先使用.pdf.eps矢量格式,它们在任意缩放下都能保持清晰。照片类图片可使用.jpg.png

3.2 构建包含子图的浮动体环境

现在,我们在文档正文部分插入我们的图形。我们将创建三个子图,每个子图显示一个函数。

\begin{figure}[htbp] \centering % 使整个figure环境内容居中 % 第一个子图:正弦函数 \begin{subfigure}[b]{0.32\linewidth} \centering % 使子图内容在subfigure的宽度内居中 \includegraphics[width=\textwidth]{sine_plot.pdf} \caption{$y = \sin(x)$} % 子标题,可以使用数学模式 \label{fig:sine} \end{subfigure} \hfill % 充满水平空间,使子图之间均匀分布 % 第二个子图:余弦函数 \begin{subfigure}[b]{0.32\linewidth} \centering \includegraphics[width=\textwidth]{cosine_plot.pdf} \caption{$y = \cos(x)$} \label{fig:cosine} \end{subfigure} \hfill % 第三个子图:正切函数 \begin{subfigure}[b]{0.32\linewidth} \centering \includegraphics[width=\textwidth]{tangent_plot.pdf} \caption{$y = \tan(x)$} \label{fig:tangent} \end{subfigure} \caption{三种基本三角函数的曲线图。 (a) 正弦函数,具有周期性和奇对称性;(b) 余弦函数,是正弦函数的相位平移;(c) 正切函数,在 $\frac{\pi}{2}+k\pi$ 处存在渐近线。} % 总标题 \label{fig:trig_functions} % 整个图的标签 \end{figure}

代码逐行解读与参数详解:

  1. \begin{figure}[htbp]:开启浮动体环境。[htbp]是位置参数,建议保持默认。它告诉 LaTeX 尝试按顺序在此处(h)、页面顶部(t)、页面底部(b)、独立一页(p)放置图形。LaTeX 会最终决定一个最优位置以保证排版美观,我们应尊重其算法,避免过度使用[h!]等强制命令。

  2. \centering:这个命令作用于整个figure环境,使其包含的所有内容(三个subfigure)在页面水平方向上居中。

  3. \begin{subfigure}[b]{0.32\linewidth}:开启一个子图环境。

    • 位置参数[b]:可选,指定子图内内容的垂直对齐方式。b表示底部对齐 (bottom),t表示顶部对齐 (top),c表示居中 (center,默认)。当子图高度不一致时,这个参数非常有用。例如,如果一张是全景照片(矮宽),一张是人像照片(高瘦),使用[b]可以让它们的底部对齐,看起来更整齐。
    • 宽度参数{0.32\linewidth}:指定该subfigure环境所占的宽度。\linewidth在当前上下文(即figure内)通常等于文本宽度。我们计划排三列,所以每列宽度略小于 1/3(这里取 0.32),为中间的\hfill留出一点空隙。
  4. \includegraphics[width=\textwidth]{sine_plot.pdf}:插入图片。

    • width=\textwidth:这里的\textwidth指的是当前subfigure环境的宽度(即我们刚才设置的0.32\linewidth)。这个设置意味着图片将撑满子图环境的宽度,是实现等宽排列的关键。
    • 图片文件名:确保sine_plot.pdf等文件存在于你的 LaTeX 项目目录中,或者提供正确的相对/绝对路径。
  5. \caption{...}\label{...}:为子图添加标题和标签。顺序很重要:必须先\caption,后\label\label命令会记录最近一个\caption产生的计数器(编号),如果顺序反了,引用就会出错。

  6. \hfill:这是一个弹性长度命令,意为“尽可能填充空间”。放在两个subfigure环境之间,它会将两者推向两端,从而在它们之间创造出均匀的间距。这是实现子图水平均匀分布最简洁有效的方法。

  7. 最后的\caption\label:为整个组合图添加总标题和标签。

编译与输出效果:编译上述代码(使用pdflatex->bibtex(如有参考文献)->pdflatex->pdflatex完整流程以确保交叉引用正确),你将得到一个编号为“图1”的浮动体。其中包含三个并排的子图,分别标记为 (a), (b), (c)。子图标题在图片下方,总标题在所有子图下方。在文中使用\ref{fig:sine}会得到 “1(a)”,使用\ref{fig:trig_functions}会得到 “1”。

4. 高级布局与样式自定义

掌握了基础排版后,我们常常需要应对更复杂的布局需求和样式调整。subcaption配合caption宏包提供了强大的控制能力。

4.1 复杂网格布局(2x2, 3x1等)

子图不一定总是排成一行。通过组合多个subfigure环境并合理使用换行,可以轻松创建网格。

示例:2x2 网格布局

\begin{figure}[htbp] \centering % 第一行 \begin{subfigure}[b]{0.48\linewidth} \centering \includegraphics[width=0.9\textwidth]{result_phase1.pdf} \caption{第一阶段结果} \label{fig:p1} \end{subfigure} \hfill \begin{subfigure}[b]{0.48\linewidth} \centering \includegraphics[width=0.9\textwidth]{result_phase2.pdf} \caption{第二阶段结果} \label{fig:p2} \end{subfigure} % 手动换行并添加垂直间距 \\[6pt] % 可选,增加行间距 % 第二行 \begin{subfigure}[b]{0.48\linewidth} \centering \includegraphics[width=0.9\textwidth]{result_phase3.pdf} \caption{第三阶段结果} \label{fig:p3} \end{subfigure} \hfill \begin{subfigure}[b]{0.48\linewidth} \centering \includegraphics[width=0.9\textwidth]{result_final.pdf} \caption{最终结果} \label{fig:pf} \end{subfigure} \caption{算法迭代过程的四个阶段输出可视化。} \label{fig:algorithm_stages} \end{figure}

要点:

  • 使用\\[6pt]在两行子图之间插入一个换行,并可选地增加[6pt]这样的垂直间距。
  • 每行内的子图宽度之和应小于 1(这里用 0.48+0.48=0.96),为\hfill留出空间。
  • 子图内的图片宽度设为0.9\textwidth而非\textwidth,是为了在子图边框内留出一些边距,使排版更透气。

4.2 垂直堆叠布局(3x1)

当图片需要纵向比较时,垂直排列是更好的选择。

\begin{figure}[htbp] \centering \begin{subfigure}[t]{\linewidth} % 宽度占满一行 \centering \includegraphics[width=0.6\linewidth]{architecture_overview.pdf} \caption{系统总体架构} \label{fig:arch} \end{subfigure} % 较大的垂直间距 \vspace{1em} \begin{subfigure}[t]{\linewidth} \centering \includegraphics[width=0.8\linewidth]{module_detail.pdf} \caption{核心模块详细设计} \label{fig:module} \end{subfigure} \vspace{1em} \begin{subfigure}[t]{\linewidth} \centering \includegraphics[width=0.7\linewidth]{data_flow.pdf} \caption{数据处理流程} \label{fig:flow} \end{subfigure} \caption{系统设计的三个层次示意图。} \label{fig:system_design} \end{figure}

要点:

  • 每个subfigure的宽度设为\linewidth,使其独占一行。
  • 使用\vspace{1em}在子图之间添加可调节的垂直间距。em是相对单位,与当前字体大小相关,比固定值如10pt更具适应性。
  • 子图内图片的宽度(如0.6\linewidth)可以根据图片本身的内容和重要性灵活调整,不必相同。

4.3 深度自定义标题样式

默认的子图编号格式是“(a)”、“(b)”。有时我们需要改成“a)”、“(A)”或其他样式。同时,主标题和子标题的字体、间距也可能需要调整。这需要借助captionsubcaption宏包提供的命令。

修改子图编号格式:在导言区(\begin{document}之前)添加以下代码:

\usepackage{caption} \usepackage{subcaption} \captionsetup[subfigure]{labelformat=simple} % 将标签格式设为“简单”模式 \renewcommand\thesubfigure{\alph{subfigure}} % 默认就是小写字母,此命令可改为大写字母 \Alph % 或者改成带点的小写字母: % \renewcommand\thesubfigure{\alph{subfigure}.} % 或者改成罗马数字: % \renewcommand\thesubfigure{\roman{subfigure}}

labelformat有几个选项:

  • simple: 仅显示编号,如a
  • parens: 编号在括号内,如(a)(默认)。
  • brace: 编号在花括号内,如{a}

统一调整所有标题样式:

\usepackage[font=small, labelfont=bf, justification=centering]{caption} \usepackage{subcaption}
  • font=small: 标题字体大小设为\small
  • labelfont=bf: 标签(如“图 1”)使用粗体。
  • justification=centering: 标题文本居中对齐(默认是左对齐)。对于很长的标题,居中对齐可能不如justification=raggedright(右对齐)或默认的左对齐美观。

单独调整子标题样式:

\captionsetup[subfigure]{font=footnotesize, labelfont=sc, labelformat=parens}
  • font=footnotesize: 子标题使用更小的字体。
  • labelfont=sc: 子图标签(如 (a))使用小型大写字母(Small Caps)字体。
  • 这些设置只对subfigure环境生效,不会影响主标题。

调整标题间距:

\captionsetup{skip=5pt} % 设置标题与上方内容的距离 \captionsetup[subfigure]{skip=2pt} % 设置子标题与上方图片的距离

skip参数控制的是标题(或子标题)与其上方内容的距离。这个细微的调整对于整体视觉平衡很重要。

实操心得:样式一致性优先在一篇文档中,所有图形的标题样式(字体、编号格式、间距)应保持严格一致。我建议在导言区一次性完成所有全局设置。除非有特殊强调的需求,否则避免在正文中局部修改样式。一个清晰的、一致的图表编号系统是专业文档的标志。

5. 常见问题、排查技巧与避坑指南

即使语法正确,在实际使用subcaption时,你仍可能会遇到一些棘手的问题。下面是我在多年实践中总结的常见“坑”及其解决方案。

5.1 引用错误:子图引用显示为“??”

这是 LaTeX 新手最常遇到的问题。引用(\ref{})显示为问号,意味着 LaTeX 没有找到对应的标签。

原因与排查步骤:

  1. 编译次数不足:LaTeX 的交叉引用需要多次编译才能正确解析。标准的流程是:

    • pdflatex your_document.tex(生成.aux文件,记录标签)
    • bibtex your_document(如果你用了参考文献,处理.bib文件)
    • pdflatex your_document.tex(读入.aux中的引用信息)
    • pdflatex your_document.tex(再次解析,确保所有引用稳定) 大多数现代编辑器(如 VS Code with LaTeX Workshop, TeXstudio)的“编译”按钮会自动执行这个完整流程。如果你手动编译,请确保至少运行两次pdflatex
  2. \label放置位置错误\label必须放在\caption命令之后\label记录的是最近一个计数器(如图号、表号、章节号)的值。如果先写\label再写\caption,那么\label记录的就是上一个计数器,导致引用错误。

    % 错误! \begin{subfigure}{...} \includegraphics{...} \label{fig:wrong} % 此时还没有生成子图编号! \caption{子标题} \end{subfigure} % 正确! \begin{subfigure}{...} \includegraphics{...} \caption{子标题} \label{fig:correct} % 在 \caption 之后 \end{subfigure}
  3. 标签名冲突:确保你在整个文档中使用的\label{}里面的名字是唯一的。不要在图、表、章节、公式中使用相同的标签名。

5.2 图片位置“乱跑”或不显示

LaTeX 的浮动体(figure,table)设计初衷是为了避免出现大块空白,优化整体排版。因此,图形可能不会精确出现在你编写代码的位置。

应对策略:

  • 理解并信任浮动算法:除非排版要求极其严格(如某些期刊要求图必须紧随文中首次提及处),否则最好接受 LaTeX 的安排。在最终稿中,位置通常是合理的。
  • 使用位置修饰符[htbp]是合理的默认值。你可以尝试[H](需要float宏包),它会强制将图形放在代码位置,但这极易造成页面底部大片空白,不推荐
  • 检查图片尺寸:如果图片本身宽度超过了\textwidth,或者你在subfigure中设置的宽度总和(加上\hfill的空间)大于 1,图片可能会溢出到页面外,导致无法正常放置和显示。始终确保宽度 * 列数 < 1
  • 查看日志文件:如果图片根本不显示,编译后查看.log文件。常见错误是“Filexxx.pdfnot found”。检查文件名拼写、大小写(在 Linux 系统下区分大小写)、文件路径是否正确。使用相对路径时,确保文件在 LaTeX 源文件所在目录或其子目录下。

5.3 子图标题或编号样式不符合预期

如果你按照第4.3节的方法自定义了样式,但编译后没变化,请检查:

  1. 宏包加载顺序\captionsetup命令必须在加载captionsubcaption宏包之后,在\begin{document}之前使用。正文中的设置可能会被局部环境覆盖。
  2. 作用域冲突:如果在文档中某个局部(如某个figure环境内或\begin{group}内)再次使用了\captionsetup,它可能会覆盖全局设置。检查是否有局部修改。
  3. 模板的威力:如果你在使用期刊或学校的 LaTeX 模板,模板很可能已经预定义了复杂的标题样式。你的自定义命令可能会被模板中的命令覆盖。在这种情况下,最稳妥的方法是查阅模板文档,找到它提供的专用命令或选项来修改样式,而不是直接使用\captionsetup

5.4 子图间距与对齐的微调

  • 水平间距\hfill是自动填充,但有时你需要固定间距。可以用\hspace{1cm}替代\hfill来插入固定的1厘米间距。
  • 垂直对齐:当子图高度不一致时,subfigure[b],[t],[c]选项就派上用场了。通常[b](底部对齐)视觉效果最稳定。你可以给一行中所有subfigure加上相同的选项。
  • 整体缩放:如果你觉得所有子图作为一个整体太小或太大,不要逐个修改子图中的\includegraphics的宽度。更优雅的方法是调整figure环境的缩放比例。但这通常不直接支持。更好的做法是,在生成图片时(如使用 Python 的 Matplotlib 或 MATLAB),就设定好合适的图形尺寸和 DPI,使得以width=\textwidth插入时大小正好。

5.5 与hyperref宏包配合的注意事项

hyperref宏包让 PDF 中的交叉引用变成可点击的链接,体验极佳。与subcaption配合,基本是开箱即用。但需注意:

  • 加载顺序hyperref宏包对加载顺序非常敏感。一个广泛认可的最佳实践是,hyperref放在所有宏包加载命令的最后(除了极少数例外,如cleveref需要在其后)。例如:
    \usepackage{graphicx} \usepackage{caption} \usepackage{subcaption} \usepackage{amsmath} % ... 其他宏包 \usepackage{hyperref} % 几乎放在最后 % \usepackage{cleveref} % 如果使用,放在 hyperref 之后
  • 链接到子图:当正确配置后,使用\ref{fig:subA}生成的 “1(a)” 中的 “(a)” 也会是一个可点击的链接,直接跳转到对应的子图,非常方便。

一个终极排查清单:当你遇到无法解决的问题时,请按此清单核对:

  1. ✅ 编译了足够次数(≥2 次pdflatex)吗?
  2. \label\caption后面吗?
  3. ✅ 标签名唯一吗?
  4. ✅ 图片文件存在且路径正确吗?
  5. ✅ 所有宏包都正确加载了吗?(检查.log文件有无 “Package not found” 错误)
  6. ✅ 图片宽度总和是否超出了可用空间?
  7. ✅ 是否与其他宏包(如过时的subfigure)冲突?确保只加载了subcaptionsubfig中的一个。
  8. ✅ 如果使用模板,是否遵循了模板关于图表排版的特殊规定?

掌握subcaption进行子图排版,是 LaTeX 进阶使用的标志性技能之一。它不仅能让你产出外观专业的文档,更能通过清晰的结构化编号和引用,极大提升文档内容组织的严谨性。从简单的并排,到复杂的网格,再到细致的样式调整,希望这篇详尽的指南能成为你手边的实用参考。记住,多实践,多编译,遇到问题时耐心查看日志文件,你很快就能驾驭这个强大的工具。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 22:53:15

长时运行智能体工程实践:从Prompt到Harness的架构设计与实现

1. 从“一次性对话”到“持久化智能体”&#xff1a;为什么我们需要“缰绳”&#xff1f;如果你在过去一年里尝试过构建AI智能体&#xff0c;大概率经历过这样的场景&#xff1a;你精心设计了一个提示词&#xff0c;让智能体去处理一个复杂的任务&#xff0c;比如分析一份几十页…

作者头像 李华
网站建设 2026/8/2 22:48:24

V6-Dooring模板库使用技巧:如何快速复用专业大屏模板

V6-Dooring模板库使用技巧&#xff1a;如何快速复用专业大屏模板 【免费下载链接】v6.dooring.public 可视化大屏解决方案, 提供一套可视化编辑引擎, 助力个人或企业轻松定制自己的可视化大屏应用. 项目地址: https://gitcode.com/gh_mirrors/v6d/v6.dooring.public V6-…

作者头像 李华
网站建设 2026/8/2 22:37:05

从CMOS宽长比到三态门:数字电路设计的核心原理与工程实践

1. 项目概述&#xff1a;从分立元件到集成逻辑的思维跃迁 刚入行搞数字电路设计那会儿&#xff0c;总觉得芯片内部是个黑盒子&#xff0c;输入高电平&#xff0c;输出低电平&#xff0c;逻辑对了就行。直到第一次亲手画版图&#xff0c;对着工艺文件里密密麻麻的规则发懵&#…

作者头像 李华
网站建设 2026/8/2 22:36:43

SwiftEntryKit弹窗管理终极指南:5个技巧解决iOS通知开发痛点

SwiftEntryKit弹窗管理终极指南&#xff1a;5个技巧解决iOS通知开发痛点 【免费下载链接】SwiftEntryKit SwiftEntryKit is a presentation library for iOS. It can be used to easily display overlays within your iOS apps. 项目地址: https://gitcode.com/gh_mirrors/sw…

作者头像 李华