diff --git a/Libraries/StyleSheet/LayoutPropTypes.js b/Libraries/StyleSheet/LayoutPropTypes.js index 15fa8ee17e2e38..2d4f9931999b55 100644 --- a/Libraries/StyleSheet/LayoutPropTypes.js +++ b/Libraries/StyleSheet/LayoutPropTypes.js @@ -365,6 +365,21 @@ var LayoutPropTypes = { flexShrink: ReactPropTypes.number, flexBasis: ReactPropTypes.number, + /** + * Aspect ratio control the size of the undefined dimension of a node. Aspect ratio is a + * non-standard property only available in react native and not CSS. + * + * - On a node with a set width/height aspect ratio control the size of the unset dimension + * - On a node with a set flex basis aspect ratio controls the size of the node in the cross axis + * if unset + * - On a node with a measure function aspect ratio works as though the measure function measures + * the flex basis + * - On a node with flex grow/shrink aspect ratio controls the size of the node in the cross axis + * if unset + * - Aspect ratio takes min/max dimensions into account + */ + aspectRatio: ReactPropTypes.number, + /** `zIndex` controls which components display on top of others. * Normally, you don't use `zIndex`. Components render according to * their order in the document tree, so later components draw over diff --git a/React/Views/RCTShadowView.h b/React/Views/RCTShadowView.h index 80ad903922ed9b..cd8f782c325ca9 100644 --- a/React/Views/RCTShadowView.h +++ b/React/Views/RCTShadowView.h @@ -138,6 +138,8 @@ typedef void (^RCTApplierBlock)(NSDictionary *viewRegistry @property (nonatomic, assign) float flexShrink; @property (nonatomic, assign) float flexBasis; +@property (nonatomic, assign) float aspectRatio; + - (void)setFlex:(float)flex; /** diff --git a/React/Views/RCTShadowView.m b/React/Views/RCTShadowView.m index ad5f746aa07653..832cb5ffe64ef6 100644 --- a/React/Views/RCTShadowView.m +++ b/React/Views/RCTShadowView.m @@ -652,6 +652,7 @@ - (type)getProp \ RCT_STYLE_PROPERTY(Position, position, PositionType, CSSPositionType) RCT_STYLE_PROPERTY(FlexWrap, flexWrap, FlexWrap, CSSWrap) RCT_STYLE_PROPERTY(Overflow, overflow, Overflow, CSSOverflow) +RCT_STYLE_PROPERTY(AspectRatio, aspectRatio, AspectRatio, float) - (void)setBackgroundColor:(UIColor *)color { diff --git a/React/Views/RCTViewManager.m b/React/Views/RCTViewManager.m index 765ed86d29eb32..3e20f6d40c117d 100644 --- a/React/Views/RCTViewManager.m +++ b/React/Views/RCTViewManager.m @@ -294,6 +294,7 @@ - (RCTViewManagerUIBlock)uiBlockToAmendWithShadowViewRegistry:(__unused NSDictio RCT_EXPORT_SHADOW_PROPERTY(alignItems, CSSAlign) RCT_EXPORT_SHADOW_PROPERTY(alignSelf, CSSAlign) RCT_EXPORT_SHADOW_PROPERTY(position, CSSPositionType) +RCT_EXPORT_SHADOW_PROPERTY(aspectRatio, float) RCT_EXPORT_SHADOW_PROPERTY(overflow, CSSOverflow) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java index 765d2cbec11bbe..4f9812ee9c2da1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java @@ -112,6 +112,11 @@ public void setFlexBasis(float flexBasis) { super.setFlexBasis(flexBasis); } + @ReactProp(name = ViewProps.ASPECT_RATIO, defaultFloat = CSSConstants.UNDEFINED) + public void setAspectRatio(float aspectRatio) { + setStyleAspectRatio(aspectRatio); + } + @ReactProp(name = ViewProps.FLEX_DIRECTION) public void setFlexDirection(@Nullable String flexDirection) { if (isVirtual()) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index 8366843bb3f7ec..95065b196365c4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -576,6 +576,10 @@ public void setFlexBasis(float flexBasis) { mCSSNode.setFlexBasis(flexBasis); } + public void setStyleAspectRatio(float aspectRatio) { + mCSSNode.setStyleAspectRatio(aspectRatio); + } + public void setFlexDirection(CSSFlexDirection flexDirection) { mCSSNode.setFlexDirection(flexDirection); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java index a9bda645c5cfb8..3e79dc32b8cf4c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java @@ -64,6 +64,8 @@ public class ViewProps { public static final String MIN_HEIGHT = "minHeight"; public static final String MAX_HEIGHT = "maxHeight"; + public static final String ASPECT_RATIO = "aspectRatio"; + // Props that affect more than just layout public static final String ENABLED = "enabled"; public static final String BACKGROUND_COLOR = "backgroundColor";