facebook / react-native

A framework for building native applications using React
https://reactnative.dev
MIT License
118.82k stars 24.29k forks source link

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

Open zglapa opened 9 months ago

zglapa commented 9 months ago

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 ); };

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, }, });

3. 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`

```text
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
github-actions[bot] commented 3 months ago

This issue is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 7 days.