react / react/react-native

Text renders 1px bigger than View when explicitly given the same height with a specific combination of height and pixel ratio.

Open
#42,140 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Author Provided Repro Type: New Architecture
Dominant language
C++
Stars
127k
Forks
25.3k
Avg merge
1d 23h
Merged PRs (30d)
4

Description

Description

Explicitly setting height: 15 on a parent View and child Text on a device with a pixel ratio of 3.5 (Pixel 7 Pro emulator) causes the child Text to render 1 px bigger than the parent View due to rounding in Yoga. When the Text is given a small border (borderWidth: 0.5) the bottom of the border is clipped by the parent View. This only happens with a certain offset from top - achieved for example by setting marginTop: 295.

There are several values and combinations of height and pixelRatio that give this result. I've only observed this on Fabric, on old architecture it renders the same.

Steps to reproduce
  1. Enable new architecture
  2. Use the following code:
const print_height = (layout: LayoutRectangle, component: string) => {
  const {height} = layout;
  console.log(`${component}'s height = ${height}`);
};

const TestApp = () => {
  return (
    <View
      style={styles.View}
      onLayout={event => print_height(event.nativeEvent.layout, 'View')}>
      <Text
        style={styles.Text}
        onLayout={event => print_height(event.nativeEvent.layout, 'Text')}>
        kkkkkkkk
      </Text>
    </View>
  );
};

const styles = StyleSheet.create({
  View: {
    justifyContent: 'center',
    alignItems: 'center',
    overflow: 'hidden',
    height: 15,
    marginTop: 295,
  },
  Text: {
    fontSize: 8,
    overflow: 'hidden',
    height: 15,
    borderWidth: 0.5,
    borderRadius: 4,
  },
});
  1. Run on a device/emulator with pixelRatio: 3.5 (ex. Pixel 7 Pro)
React Native Version

0.73.1

Affected Platforms

Runtime - Android

Areas

Fabric - The New Renderer

Output of npx react-native info
System:
  OS: macOS 13.5.2
  CPU: (8) arm64 Apple M1 Pro
  Memory: 100.84 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 20.8.0
    path: /opt/homebrew/bin/node
  Yarn:
    version: 1.22.21
    path: /opt/homebrew/bin/yarn
  npm:
    version: 10.1.0
    path: /opt/homebrew/bin/npm
  Watchman:
    version: 2023.09.25.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods: Not Found
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.2
      - iOS 17.2
      - macOS 14.2
      - tvOS 17.2
      - watchOS 10.2
  Android SDK: Not Found
IDEs:
  Android Studio: 2022.3 AI-223.8836.35.2231.10406996
  Xcode:
    version: 15.1/15C65
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.6
    path: /usr/bin/javac
  Ruby:
    version: 3.2.2
    path: /opt/homebrew/opt/ruby/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: 18.2.0
  react-native:
    installed: 0.73.1
    wanted: 0.73.1
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: Not found
  newArchEnabled: false
Stacktrace or Logs
n\a
Reproducer

https://github.com/zglapa/reproducer_view_text_size

Screenshots and Videos
Screenshot 2024-01-04 at 12 17 51

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue names no repository files or tests. Start by running the linked reproducer with Fabric enabled on an Android device or emulator using a 3.5 pixel ratio, then trace the layout rounding behavior in the Fabric/Yoga path. Done means the explicitly equal View and Text heights remain equal and the half-pixel border is not clipped for the reported reproduction.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, react
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.