移动开发中的文本与排版:概念、工具及工作原理

作者: IT Sectr 发布日期: 2026-08-04 阅读时间: 10 分钟

在现代移动应用程序的界面创建中,处理文本是一项关键任务。从字体选择到字符间距调整,每个方面都会影响用户对产品的感知。根据Apple NSAttributedString 文档,正确的文本格式直接关系到界面的可读性和可访问性。

要点

  • NSAttributedString — 用于创建带有字体、颜色和间距属性的格式化文本的iOS类。
  • SpannableString — Android上的对应类,使用Span对象来样式化单个文本片段。
  • UIFont 和 Typeface — iOS和Android上的主要字体类;自定义字体通过Info.plist和res/font添加。
  • 字距调整和连字 — 控制字符间距离及其合并为一个字形的排版参数。
  • 可变字体 — 单个字体文件包含多种样式,从而减小应用程序体积。

移动应用中的文本:iOS上的NSAttributedString

NSAttributedString是iOS中处理格式化文本的基础类。它允许将属性应用于单个字符或范围:通过UIFont设置字体、通过UIColor设置颜色、通过kern设置字符间距、通过NSMutableParagraphStyle设置行间距。在移动应用中,NSAttributedString被广泛使用——从UILabel到支持编辑的复杂UITextView。

UIFont和字体配置

UIFont是iOS上处理字体的主要类。它支持系统字体、自定义字体和Dynamic Type。UIFont(name:size:)按名称加载字体,UIFont.systemFont(ofSize:weight:)加载系统字体。UIFontDescriptor允许修改现有字体:更改大小、粗细或添加变换矩阵。对于自定义字体,.ttf文件被添加到项目中,并在Info.plist的Fonts provided by application键下注册。

swift
let attributes: [NSAttributedString.Key: Any] = [
    .font: UIFont(name: "HelveticaNeue-Bold", size: 18) as Any,
    .foregroundColor: UIColor.darkGray as Any,
    .kern: 1.5 as Any
]
let attributedString = NSAttributedString(
    string: "Форматированный текст",
    attributes: attributes
)
label.attributedText = attributedString

NSMutableParagraphStyle和段落格式化

NSMutableParagraphStyle是ParagraphStyle的可变版本,用于配置段落显示。它控制对齐方式(alignment)、行间距(lineSpacing)、缩进(headIndent、tailIndent)和截断模式(lineBreakMode)。ParagraphStyle对于移动设备上长文本的可读性至关重要:正确的lineSpacing可防止行合并,lineBreakMode可防止单词裁剪。paragraphSpacing设置定义段落之间的间距。

移动应用中的文本:Android上的SpannableString

SpannableString是Android上文本格式化的主要工具。它通过Span对象机制工作,每个对象负责一个方面:StyleSpan用于粗体或斜体,ForegroundColorSpan用于颜色,URLSpan用于链接,UnderlineSpan用于下划线。SpannableStringBuilder相当于NSMutableAttributedString,允许从多个片段构建文本。理解SpannableString对于在移动应用中创建具有格式化文本的灵活界面至关重要。

Android上的Typeface和自定义字体

Typeface是Android上处理字体的类。它支持系统字体Roboto和Noto,以及自定义字体。Typeface.createFromResource()从res/font/加载字体,Typeface.createFromAsset()从assets文件夹加载字体。Android 8.0+支持XML中的字体系列,将多个字体文件合并为一个资源。Android移动应用中文本的自定义字体通过android:fontFamily属性或通过编程方式使用setTypeface()设置。

TextMeasurer和文本测量

TextMeasurer(API 29+)是一种无需绑定到View即可测量文本的现代工具。它在渲染前计算宽度、高度和字符位置。在较旧的API上,单行文本使用Paint.measureText(),多行文本使用StaticLayout。TextMeasurer在通过Canvas.drawText()绘制文本的自定义View中特别有用。正确的测量可防止界面中的字符被裁剪。

kotlin
val spannable = SpannableString("Жирный текст с цветом")
spannable.setSpan(
    StyleSpan(Typeface.BOLD),
    0, 6,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
    ForegroundColorSpan(Color.RED),
    14, 19,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable

移动开发中的排版:字距调整、连字和跟踪

移动应用中的排版是字体、字符间距和行间距的综合配置。移动开发中的正确排版直接影响文本的可读性和界面的视觉感知。让我们看看两个平台上可用的关键参数。

字距调整和跟踪

字距调整是调整特定字符对(AV、To、Wa)之间的间距。跟踪是整个文本或部分文本的统一字符间距。在iOS上,字距调整通过NSKernAttributeName设置,在Android上则通过TextView的letterSpacing属性设置。负值使字符靠近,正值使字符分散。移动开发中的排版需要仔细调整这些参数:对于大标题,字符间距通常增加,对于正文则保持标准。

参数iOSAndroid
样式化字符串NSAttributedStringSpannableString
字体UIFont / CTFontTypeface
字符间距NSKernAttributeNameletterSpacing
行间距lineSpacinglineSpacingExtra
连字NSLigatureAttributeNameOpenType功能
省略号lineBreakMode .byTruncatingTailandroid:ellipsize

连字

连字是替代两个或多个字符组合(fi、fl、ffi)的特殊字形。在iOS上,连字通过NSLigatureAttributeName控制:0 — 禁用,1 — 标准,2 — 所有可用。在Android上,连字通过OpenType功能在字体级别控制。启用连字可以改善文本外观,特别是在衬线字体中。移动开发中的排版主要将连字用于标题和标志。

移动应用中的自定义字体:加载和配置

自定义字体是为应用程序创建独特视觉风格的主要工具之一。它们有助于突出品牌并改善用户体验。在移动应用中,自定义字体用于标题、标志、强调元素和企业标识。

可变字体

可变字体是一种现代字体技术,单个文件包含多种样式:从细到超粗,从窄到宽。这通过用单个文件替换多个字体文件来减小应用程序体积。在iOS上,可变字体通过带有weight参数的UIFont支持。在Android上,通过指定可变轴wght、wdth、slnt的Typeface.Builder支持。使用可变字体简化了移动应用中的排版:开发人员无需为每种样式加载单独的文件。

swift
let customFont = UIFont(name: "CustomFont-Regular", size: 16)
let scaledFont = UIFontMetrics.default
    .scaledFont(for: customFont)
label.font = scaledFont
label.adjustsFontForContentSizeCategory(true)

NSTextAttachment和ImageSpan

iOS上的NSTextAttachment允许在NSAttributedString中嵌入UIImage——图像与基线对齐并随文本移动。在Android上,相当于SpannableString内的ImageSpan。这两种方法都适用于带表情符号的聊天、带图标的新闻提要以及带自定义复选框的表单。正确缩放图像以匹配字体高度非常重要,这样文本和图形才能显得协调。

文本效果、对齐和省略号

除了基本格式化之外,移动应用中的文本还支持额外的视觉效果:阴影、轮廓、删除线和下划线。这些工具扩展了排版的可能,但需要谨慎应用以保持可读性。

文本阴影和轮廓

iOS上的文本阴影通过带有offset、blurRadius和color的NSShadow设置。轮廓通过NSStrokeWidthAttributeName设置:负值创建带有轮廓的填充,正值仅创建轮廓。删除线——NSUnderlineStyle(.single、.thick、.double)。在Android上,TextView阴影通过android:shadowRadius、android:shadowDx、android:shadowDy配置。SpannableString支持StrikethroughSpan和UnderlineSpan。Android上的文本轮廓通过OutlineSpan或自定义字体实现。

省略号和跑马灯

省略号是在容器溢出时用省略号截断文本。在iOS上,通过lineBreakMode .byTruncatingTail和numberOfLines配置。在Android上,通过android:ellipsize="end"和android:maxLines配置。跑马灯是一种在Android上通过android:ellipsize="marquee"可用的滚动文本动画。在iOS上没有内置的等效功能——使用MarqueeLabel库。省略号对于移动应用中所有单行文本是必需的,以避免内容被裁剪。

iOS上的Dynamic Type

Dynamic Type是iOS中的一个自适应文本系统,根据用户的辅助功能设置调整字体大小。使用UIFontMetrics来缩放自定义字体。Dynamic Type对于符合辅助功能要求的应用程序是必需的。在Android上,等效的是sp单位和scaledPixels,它们根据系统文本大小设置进行缩放。

常见问题

什么是NSAttributedString?

NSAttributedString是一个iOS类,用于在字符和范围级别创建带有字体、颜色和样式属性的格式化文本。

Android上的SpannableString是什么?

SpannableString是一个Android类,通过Span对象(ForegroundColorSpan、StyleSpan、URLSpan、UnderlineSpan)进行文本标记。

如何在iOS中添加自定义字体?

.ttf文件添加到项目,在Info.plist的Fonts provided by application键下指定它,然后使用UIFont(name:)。

如何在Android上加载自定义字体?

.ttf文件放在res/font/中,创建XML字体系列,并指定android:fontFamily或使用Typeface.createFromAsset()。

什么是字距调整和连字?

字距调整是字符对之间的间距。连字是字母组合的特殊字形。它们通过NSKernAttributeName和NSLigatureAttributeName控制。

总结

  • NSAttributedString — iOS上主要的文本格式化工具,支持字体、颜色、字符间距和段落样式。
  • SpannableString — 使用Span对象的Android对应类:StyleSpan(粗细)、ForegroundColorSpan(颜色)、URLSpan(链接)。
  • UIFont和Typeface — iOS和Android上的字体类;自定义字体分别通过Info.plist和res/font添加。
  • 字距调整和跟踪 — 控制字符间距;字距调整针对个别字符对,跟踪均匀应用于整个文本。
  • 连字 — 用单个字形替换字符组合;在iOS上通过NSLigatureAttributeName控制,在Android上通过OpenType控制。
  • 可变字体和Dynamic Type — 现代技术:一个文件对应多种样式,并自动适应用户设置。
  • 移动开发中的排版涵盖字体、行间距、连字、阴影和省略号,以确保可读性。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目