react / react/react-native

[android] [ios] [web] `measure` returns incorrect values of `View` if its parent `View` is `scale`d using `transform` style

Ouverte
#54,988 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Needs: Triage :mag:
Langage dominant
C++
Étoiles
127k
Forks
25.3k
Merge moyen
1 j 23 h
PR mergées (30 j)
4

Description

Description

If use measure method to calculate x, y, width, height, pageX, pageY values of View it will return incorrect values in case if parent View has styles:

transform: [
  {
    scale: 2,
  },
],

in this case width, height, pageX, pageY values from measure callback will be doubled compared to real ones.

Specs

  • It is wrong due docs as transform style prop doesnt change layout, transform is used to change appearance only:

    Transforms are style properties that will help you modify the appearance and position of your components using 2D or 3D transformations. However, once you apply transforms, the layouts remain the same around the transformed component

  • It is inconsistent with react-native-web where transform doesnt affect width, height, pageX, pageY values
  • It is inconsistent with response of onLayout callback which will return width, height NOT scaled

Problem

There are 3 different behaviors:

  • react-native-web returns real sizes
  • onLayout returns real sizes
  • measure returns size SCALED due to its parent transform style
Steps to reproduce

See example

React Native Version

0.81.5

Affected Platforms

Runtime - Android,
Runtime - iOS,
Runtime - Web

Output of npx @react-native-community/cli info
See example
Stacktrace or Logs
See example console logs on Android (or iOS)
MANDATORY Reproducer

https://snack.expo.dev/@sepu/rn-measure-bug-w-transform

Screenshots and Videos

web console logs (3rd and 4th parameters are the same) which is ok:

>>>>> useLayoutEffect measure x, y, width, height, pageX, pageY 134 351 71 39 134 351
onLayoutHandler layout.x, layout.y, layout.width, layout.height 134 351 71 39

Android / iOS console logs (3rd and 4th parameters for measure are 2x bigger than from onLayout):

>>>>> useLayoutEffect measure x, y, width, height, pageX, pageY 176 456 148 78 139 437
onLayoutHandler layout.x, layout.y, layout.width, layout.height 176 456 74 39

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le reproducer Snack obligatoire et comparez measure à onLayout sur Android, iOS et le web. Suivez le comportement de mesure spécifique à chaque plateforme montré par le reproducer ; le travail est terminé lorsque measure renvoie des valeurs cohérentes avec la mise en page non mise à l’échelle ainsi qu’avec les résultats existants du web et de onLayout.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, react-native
Domaine
mobile-dev
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
50/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.