Skip to content

Commit

Permalink
add StyleSheet.absoluteFill convenience constant
Browse files Browse the repository at this point in the history
Summary:
It's annoying and inefficient to create styles like

```
  wrapper: {
    position: 'absolute',
    left: 0,
    right: 0,
    top: 0,
    bottom: 0,
  },
```

all the time, so this makes a handy constant for reuse and a helper method to create customized
styles.

Reviewed By: devknoll

Differential Revision: D3389612

fbshipit-source-id: 88fbe9e8ca32a0bc937bf275cf5ae0739ee21302
  • Loading branch information
sahrens authored and Facebook Github Bot 2 committed Jun 6, 2016
1 parent bf010a4 commit e79f5d7
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
54 changes: 25 additions & 29 deletions Libraries/ReactIOS/renderApplication.android.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@

'use strict';

var Inspector = require('Inspector');
var RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
var React = require('React');
var ReactNative = require('ReactNative');
var StyleSheet = require('StyleSheet');
var Subscribable = require('Subscribable');
var View = require('View');
const Inspector = require('Inspector');
const RCTDeviceEventEmitter = require('RCTDeviceEventEmitter');
const React = require('React');
const ReactNative = require('ReactNative');
const StyleSheet = require('StyleSheet');
const Subscribable = require('Subscribable');
const View = require('View');

var invariant = require('fbjs/lib/invariant');
const invariant = require('fbjs/lib/invariant');

var YellowBox = __DEV__ ? require('YellowBox') : null;
const YellowBox = __DEV__ ? require('YellowBox') : null;

// require BackAndroid so it sets the default handler that exits the app if no listeners respond
require('BackAndroid');

var AppContainer = React.createClass({
const AppContainer = React.createClass({
mixins: [Subscribable.Mixin],

getInitialState: function() {
Expand All @@ -41,7 +41,7 @@ var AppContainer = React.createClass({
toggleElementInspector: function() {
this.setState({
inspectorVisible: !this.state.inspectorVisible,
rootNodeHandle: ReactNative.findNodeHandle(this.refs.main),
rootNodeHandle: ReactNative.findNodeHandle(this._mainRef),
});
},

Expand All @@ -63,7 +63,7 @@ var AppContainer = React.createClass({
onRequestRerenderApp={(updateInspectedViewTag) => {
this.setState(
(s) => ({mainKey: s.mainKey + 1}),
() => updateInspectedViewTag(ReactNative.findNodeHandle(this.refs.main))
() => updateInspectedViewTag(ReactNative.findNodeHandle(this._mainRef))
);
}}
/> :
Expand All @@ -74,21 +74,26 @@ var AppContainer = React.createClass({
this._unmounted = true;
},

_setMainRef: function(ref) {
this._mainRef = ref;
},

render: function() {
var RootComponent = this.props.rootComponent;
var appView =
const RootComponent = this.props.rootComponent;
const appView =
<View
ref="main"
ref={this._setMainRef}
key={this.state.mainKey}
collapsable={!this.state.inspectorVisible}
style={styles.appContainer}>
style={StyleSheet.absoluteFill}>
<RootComponent
{...this.props.initialProps}
rootTag={this.props.rootTag}
importantForAccessibility={this.state.rootImportanceForAccessibility}/>
importantForAccessibility={this.state.rootImportanceForAccessibility}
/>
</View>;
return __DEV__ ?
<View style={styles.appContainer}>
<View style={StyleSheet.absoluteFill}>
{appView}
<YellowBox />
{this.renderInspector()}
Expand All @@ -110,19 +115,10 @@ function renderApplication<D, P, S>(
<AppContainer
rootComponent={RootComponent}
initialProps={initialProps}
rootTag={rootTag} />,
rootTag={rootTag}
/>,
rootTag
);
}

var styles = StyleSheet.create({
appContainer: {
position: 'absolute',
left: 0,
top: 0,
right: 0,
bottom: 0,
},
});

module.exports = renderApplication;
30 changes: 30 additions & 0 deletions Libraries/StyleSheet/StyleSheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ if (hairlineWidth === 0) {
hairlineWidth = 1 / PixelRatio.get();
}

const absoluteFillObject = {
position: 'absolute',
left: 0,
right: 0,
top: 0,
bottom: 0,
};
const absoluteFill = ReactNativePropRegistry.register(absoluteFillObject); // This also freezes it

/**
* A StyleSheet is an abstraction similar to CSS StyleSheets
*
Expand Down Expand Up @@ -86,6 +95,27 @@ module.exports = {
*/
hairlineWidth,

/**
* A very common pattern is to create overlays with position absolute and zero positioning,
* so `absoluteFill` can be used for convenience and to reduce duplication of these repeated
* styles.
*/
absoluteFill,

/**
* Sometimes you may want `absoluteFill` but with a couple tweaks - `absoluteFillObject` can be
* used to create a customized entry in a `StyleSheet`, e.g.:
*
* const styles = StyleSheet.create({
* wrapper: {
* ...StyleSheet.absoluteFillObject,
* top: 10,
* backgroundColor: 'transparent',
* },
* });
*/
absoluteFillObject,

/**
* Flattens an array of style objects, into one aggregated style object.
* Alternatively, this method can be used to lookup IDs, returned by
Expand Down

1 comment on commit e79f5d7

@fab1an
Copy link

@fab1an fab1an commented on e79f5d7 Jul 7, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just want to link to my library react-native-tachyons here, which includes this constant and similar styling as well.

Please sign in to comment.