我在ios 上发现一个奇怪的bug, 在非详情页,文字应当最多展示8行再展示省略号,但有的crad 中,文字展示两行或者三行就展示省略号了,有时候文字下方还有一行空白。

<Text
style={styles.content}
numberOfLines={ 8}
ellipsizeMode={'tail'}>{content}</Text>出现bug 的文章是:
“孙东升从生态环境局局长履新图们市委书记啦😎。孙东升7月曾被公示拟任县(市、区)党委正职,他有法学硕士学历,历任多职,2023年5月任生态环境局局长,此次履新或为图们发展注入新活力。”
开始没觉得是文字问题,觉得可能是系统兼容问题。后来让codex 帮我分析了一下:
卡片里提前出现省略号、下方还空出一行的根因在 Text 组件本身,而不是数据问题。我们自定义的 ~/components/Text(src/components/Text/index.tsx (lines 69-83))给每种字号都写死了固定的 lineHeight(例如 normal 直接是 22)。React Native 在 iOS 上计算 numberOfLines 时会用 lineHeight * numberOfLines 得到一个最高高度,然后把文本裁到这个高度。只要某一行里出现比 22 更高的字形(emoji、部分生僻字、或系统字体被放大),真实行高就会超过 22,结果最多只能放下很少的几行——比如你提到的那条内容包含 😎,它在 iOS 的行高远高于 22,于是 8 行额度瞬间被吃掉,只剩 2~3 行文字,后面都显示为空白再接省略号。
解决思路:
- 让 iOS 自己决定行高。最简单是把 lineHeight 从默认 Text 样式里去掉,或者至少对 iOS 不设置固定 lineHeight(Platform.select)。这样 numberOfLines 会按照真实行高去算,emoji/大字体也能占够空间。
- 如果必须保留统一行距,可以将 lineHeight 设置成 fontSize * fontScale 这类动态值,确保永远大于系统可能使用的真实行高;或者直接给 PostCard 里的正文 <Text> 加 allowFontScaling={false},但这样用户调大系统字体会失效。
- 调试时可以暂时把 styles.content 的 paddingBottom 去掉(src/components/PostCard/index.tsx (lines 371-387)),避免空白区让问题更明显。
建议先在 ~/components/Text 里调整 lineHeight 逻辑,再到 iOS 复测包含 emoji 的帖子,应该就能稳定展示满 8 行。
经过测试调试,果然是行高导致的。
AI 还是牛。
