Consistent font line height rendering
Rendering of the fonts differs on Android and iOS.
Even on iOS before version 7.
Recently I had to use the same font on the React Native project for both platforms. The difference was just too big.
Styles I’ve used:
{
fontSize: 12,
lineHeight: 18
}
On Android the line height rendered <Text />
component:
- 1 line of text, text object height:
18
units - 2 lines of text, text object height:
43.333...
units
Expected value was 46
. iOS on the other hand rendered text object 46 units height.
Few hours later, many app uninstalls, react-native link
commands & app reloads later.
Solution
- Download Font Tools for Xcode
- In Terminal run
$ ftxdumperfuser -t hhea -A d pathtoyourfont.ttf
- Edit dumped
pathtoyourfont.hhea.xml
and setlineGap="0"
- If
lineGap
was200
andascender="800"
, set ascender to the sum ot these two1000
- In Terminal run
$ ftxdumperfuser -t hhea -A f pathtoyourfont.ttf
Done. Your new values are fused back the font file.
Repeat steps 4 and 5 until the rendering is OK. Do not change other values. Those should be OK.
Value that finally worked for me was ascender="1050"
. Try to change the sum until Android and iOS render the <Text />
component the same height.
Note: includeFontPadding
had no impact on rendering, nor textAlignVertical
as suggested in the official React Native Text docs.
Many kudos to the tips from StackOverflow. Some of them were dead ends, hence this post.