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.

Offen
#42,140 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Issue: Author Provided Repro Type: New Architecture
Vorherrschende Sprache
C++
Sterne
127k
Forks
25.3k
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
4

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Die Issue nennt keine Repository-Dateien oder Tests. Führe zunächst den verlinkten Reproducer mit aktiviertem Fabric auf einem Android-Gerät oder -Emulator mit einem Pixelverhältnis von 3.5 aus und verfolge dann das Verhalten bei der Layout-Rundung im Fabric/Yoga-Pfad. Als abgeschlossen gilt die Arbeit, wenn die ausdrücklich gleichen View- und Text-Höhen gleich bleiben und der Halb-Pixel-Rand bei der gemeldeten Reproduktion nicht abgeschnitten wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
android, react
Bereich
mobile-dev
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.