New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for delete animation in LayoutAnimation on iOS #6779

Closed
wants to merge 5 commits into
base: master
from

Conversation

Projects
None yet
7 participants
@janicduplessis
Collaborator

janicduplessis commented Apr 2, 2016

This adds support for delete view animations in LayoutAnimation for iOS. It supports the same properties as the create animation (alpha, scale).

This allows making simple animations when removing a view which is normally hard to do in React since we need to not remove the view node immediately.

Test plan
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Also tested that the completion callback still works properly. Tested that user interation during the animation is properly disabled.

layout-anim2

I also plan to work on improving the doc for LayoutAnimation as well as making this PR for android too.

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot Apr 2, 2016

By analyzing the blame information on this pull request, we identified @ericvicenti, @sahrens and @mkonicek to be potential reviewers.

facebook-github-bot commented Apr 2, 2016

By analyzing the blame information on this pull request, we identified @ericvicenti, @sahrens and @mkonicek to be potential reviewers.

Show outdated Hide outdated Libraries/LayoutAnimation/LayoutAnimation.js
@@ -74,6 +74,12 @@ function configureNext(config: Config, onAnimationDidEnd?: Function) {
UIManager.configureNextLayoutAnimation(
config, onAnimationDidEnd || function() {}, function() { /* unused */ }
);
// Clear the layout animation configuration after the current frame.

This comment has been minimized.

@janicduplessis

janicduplessis Apr 2, 2016

Collaborator

I moved reseting the layout animation configuration to JS since it needs to be reset at the end of the JS frame and not only in the _layoutAndMount function. Not sure if there is a hook in native that gets called at the end of the JS frame it might be better there.

@janicduplessis

janicduplessis Apr 2, 2016

Collaborator

I moved reseting the layout animation configuration to JS since it needs to be reset at the end of the JS frame and not only in the _layoutAndMount function. Not sure if there is a hook in native that gets called at the end of the JS frame it might be better there.

Show outdated Hide outdated Libraries/LayoutAnimation/LayoutAnimation.js
UIManager.configureNextLayoutAnimation(
null, function() { /* unused */ }, function() { /* unused */ }
);
});
}
function create(duration: number, type, creationProp): Config {

This comment has been minimized.

@janicduplessis

janicduplessis Apr 2, 2016

Collaborator

Should we support setting a different prop for create and delete or this seems fine?

@janicduplessis

janicduplessis Apr 2, 2016

Collaborator

Should we support setting a different prop for create and delete or this seems fine?

Show outdated Hide outdated Libraries/LayoutAnimation/LayoutAnimation.js
@@ -74,6 +74,12 @@ function configureNext(config: Config, onAnimationDidEnd?: Function) {
UIManager.configureNextLayoutAnimation(
config, onAnimationDidEnd || function() {}, function() { /* unused */ }
);
// Clear the layout animation configuration after the current frame.
requestAnimationFrame(() => {

This comment has been minimized.

@eslint-bot

eslint-bot Apr 2, 2016

identifier requestAnimationFrame Could not resolve name

@eslint-bot

eslint-bot Apr 2, 2016

identifier requestAnimationFrame Could not resolve name

@mkonicek

This comment has been minimized.

Show comment
Hide comment
@mkonicek

mkonicek Apr 7, 2016

Contributor

Wow!

@sahrens, @vjeux What do you think? This seems pretty impactful.

Contributor

mkonicek commented Apr 7, 2016

Wow!

@sahrens, @vjeux What do you think? This seems pretty impactful.

@vjeux

This comment has been minimized.

Show comment
Hide comment
@vjeux

vjeux Apr 7, 2016

Contributor

Looks good to me, but I'll let @sahrens review it

Contributor

vjeux commented Apr 7, 2016

Looks good to me, but I'll let @sahrens review it

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 7, 2016

Collaborator

@vjeux @sahrens I found an issue with resetting the layout anination when doing more testing. Sometimes it gets reset too early with requestAnimationFrame. If I do something like setTimeout 100 then it works perfectly but that's not a valid solution.

It still works most of the time so maybe it's an issue with the order the commands get dispatched through the bridge? Any idea on a way to make sure the layout animation gets reset after all the view operations are done?

I'll investigate this more this weekend.

Collaborator

janicduplessis commented Apr 7, 2016

@vjeux @sahrens I found an issue with resetting the layout anination when doing more testing. Sometimes it gets reset too early with requestAnimationFrame. If I do something like setTimeout 100 then it works perfectly but that's not a valid solution.

It still works most of the time so maybe it's an issue with the order the commands get dispatched through the bridge? Any idea on a way to make sure the layout animation gets reset after all the view operations are done?

I'll investigate this more this weekend.

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 12, 2016

Contributor

This is awesome! Do you have a video of it working?

Hmm, if the layout takes more than one frame then I believe it's possible for requestAnimationFrame to fire before the layout completes. Can you use onLayout instead an verify that the layout has finished updating?

Contributor

sahrens commented Apr 12, 2016

This is awesome! Do you have a video of it working?

Hmm, if the layout takes more than one frame then I believe it's possible for requestAnimationFrame to fire before the layout completes. Can you use onLayout instead an verify that the layout has finished updating?

RCTLogError(@"Unsupported layout animation createConfig property %@",
deleteAnimation.property);
}
} withCompletionBlock:completion];

This comment has been minimized.

@sahrens

sahrens Apr 12, 2016

Contributor

I'm worried about weird edge-cases that could happen if the user interacts with the app while this deletion animation is running. Perhaps we should make the view immediately non-interactable? Any other safeguards we could use? How much did you bang on the prototype?

@sahrens

sahrens Apr 12, 2016

Contributor

I'm worried about weird edge-cases that could happen if the user interacts with the app while this deletion animation is running. Perhaps we should make the view immediately non-interactable? Any other safeguards we could use? How much did you bang on the prototype?

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 12, 2016

Contributor

cc @nicklockwood since he owns the layout animation implementation these days - any other concerns, Nick?

Contributor

sahrens commented Apr 12, 2016

cc @nicklockwood since he owns the layout animation implementation these days - any other concerns, Nick?

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 12, 2016

Contributor

Requesting changes for you to

  • Beef up the test plan (maybe include an rnplay build for other people to bang on?)
  • Fix the requestAnimationFrame stuff...definitely don't want any race conditions in there. Might need some special native logic to get it working right if you can't get onLayout to work 100%.
Contributor

sahrens commented Apr 12, 2016

Requesting changes for you to

  • Beef up the test plan (maybe include an rnplay build for other people to bang on?)
  • Fix the requestAnimationFrame stuff...definitely don't want any race conditions in there. Might need some special native logic to get it working right if you can't get onLayout to work 100%.
@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot commented Apr 18, 2016

@janicduplessis updated the pull request.

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 18, 2016

Collaborator

Thanks @sahrens for the review, I did some more debugging and found a way to clear the layout animation properly.

Good point about edge cases I did some more testing by making the transition super slow and added some Touchable and native views inside the view that gets deleted with an animation. It doesn't cause any issue, for touchable (and probably any js driven view) it just stop responding to interactions, for native views (Switch for example) it is still possible to interact with it but nothing gets sent to JS.

Do we want to set userInterationsEnabled = false here to have the same behaviour for all the views when they are getting removed with an animation?

I don't think I can put an example on RNPlay since it needs native code from this PR to work. I did some testing using the example I added to UIExplorer and made the animation super slow.
https://gist.github.com/janicduplessis/8e0dc3a711113006a55ae7f6f04dd45a

Collaborator

janicduplessis commented Apr 18, 2016

Thanks @sahrens for the review, I did some more debugging and found a way to clear the layout animation properly.

Good point about edge cases I did some more testing by making the transition super slow and added some Touchable and native views inside the view that gets deleted with an animation. It doesn't cause any issue, for touchable (and probably any js driven view) it just stop responding to interactions, for native views (Switch for example) it is still possible to interact with it but nothing gets sent to JS.

Do we want to set userInterationsEnabled = false here to have the same behaviour for all the views when they are getting removed with an animation?

I don't think I can put an example on RNPlay since it needs native code from this PR to work. I did some testing using the example I added to UIExplorer and made the animation super slow.
https://gist.github.com/janicduplessis/8e0dc3a711113006a55ae7f6f04dd45a

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot commented Apr 18, 2016

@janicduplessis updated the pull request.

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 18, 2016

Collaborator

Here's a video of it.

layout-anim2

I added a cross fade example too but it could be improved because the view that gets removed should not fade out, it should just stay untill the animation is over, I was thinking adding a delete animation the just makes the view stays untill the LayoutAnimation is over and add a CrossFade preset. However, it should probably be in another PR.

Collaborator

janicduplessis commented Apr 18, 2016

Here's a video of it.

layout-anim2

I added a cross fade example too but it could be improved because the view that gets removed should not fade out, it should just stay untill the animation is over, I was thinking adding a delete animation the just makes the view stays untill the LayoutAnimation is over and add a CrossFade preset. However, it should probably be in another PR.

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot commented Apr 18, 2016

@janicduplessis updated the pull request.

@mkonicek

This comment has been minimized.

Show comment
Hide comment
@mkonicek

mkonicek Apr 22, 2016

Contributor

Thanks a lot for the review @sahrens! Is this good to go now?

Contributor

mkonicek commented Apr 22, 2016

Thanks a lot for the review @sahrens! Is this good to go now?

{
this.state.toggled ?
<GreenSquare /> :
<BlueSquare />

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

This is pretty sick how easy this is.

@sahrens

sahrens Apr 22, 2016

Contributor

This is pretty sick how easy this is.

Show outdated Hide outdated React/Modules/RCTUIManager.m
[self _removeChildren:permanentlyRemovedChildren fromContainer:container];
[self _removeChildren:temporarilyRemovedChildren fromContainer:container];
[self _removeChildren:permanentlyRemovedChildren fromContainer:container permanent: true];
[self _removeChildren:temporarilyRemovedChildren fromContainer:container permanent: false];

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

nit: no space after colons.

@sahrens

sahrens Apr 22, 2016

Contributor

nit: no space after colons.

Show outdated Hide outdated Examples/UIExplorer/LayoutAnimationExample.js
_onPressToggle() {
LayoutAnimation.easeInEaseOut();
this.setState({toggled: !this.state.toggled});

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

nit: use state function:

this.setState((state) => ({toggled: !state.toggled}));
@sahrens

sahrens Apr 22, 2016

Contributor

nit: use state function:

this.setState((state) => ({toggled: !state.toggled}));

This comment has been minimized.

@janicduplessis

janicduplessis Apr 22, 2016

Collaborator

Wow, I didn't know you could do that, looks a lot cleaner :)

@janicduplessis

janicduplessis Apr 22, 2016

Collaborator

Wow, I didn't know you could do that, looks a lot cleaner :)

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

It's also more correct because another state update might be queued but not yet reflected in this.state, using the function makes sure you are operating on the latest state.

@sahrens

sahrens Apr 22, 2016

Contributor

It's also more correct because another state update might be queued but not yet reflected in this.state, using the function makes sure you are operating on the latest state.

Show outdated Hide outdated Examples/UIExplorer/LayoutAnimationExample.js
_onPressAddView() {
LayoutAnimation.easeInEaseOut();
this.setState({views: [...this.state.views, {}]});

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

These should also use state mutation functions.

@sahrens

sahrens Apr 22, 2016

Contributor

These should also use state mutation functions.

Show outdated Hide outdated Examples/UIExplorer/LayoutAnimationExample.js
},
_onPressRemoveView() {
LayoutAnimation.easeInEaseOut();

This comment has been minimized.

@sahrens

sahrens Apr 22, 2016

Contributor

Another approach would be to add LayoutAnimat.easeInEaseOut() to componentWillUpdate().

@sahrens

sahrens Apr 22, 2016

Contributor

Another approach would be to add LayoutAnimat.easeInEaseOut() to componentWillUpdate().

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 22, 2016

Contributor

This looks awesome, just some nits.

I'm not sure I understand what you're saying about the cross-fade - what's wrong with the one deleted fading out?

I do agree in general that there should be more configuration options, though. Looking forward to more PR's!

Contributor

sahrens commented Apr 22, 2016

This looks awesome, just some nits.

I'm not sure I understand what you're saying about the cross-fade - what's wrong with the one deleted fading out?

I do agree in general that there should be more configuration options, though. Looking forward to more PR's!

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 22, 2016

Contributor

Also, can you put the video in the test plan?

Contributor

sahrens commented Apr 22, 2016

Also, can you put the video in the test plan?

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 22, 2016

Contributor

Have you had a chance to look at the Android implementation yet? Any estimate on how long that might take?

Contributor

sahrens commented Apr 22, 2016

Have you had a chance to look at the Android implementation yet? Any estimate on how long that might take?

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 22, 2016

Collaborator

It's hard to see in the video but in the middle of the animation the view becomes a bit white (or whatever the background color is under the cross fading views). It happens because the old view alpha is at 0.5 and the new view alpha is at 0.5 too so the background color behind those 2 views become visible. To avoid this we can just animate the alpha of the new view and just keep the old one around untill the animation is over.

As for the Android implementation I haven't looked at it yet so I have no idea if it's going to be simple or not.

Collaborator

janicduplessis commented Apr 22, 2016

It's hard to see in the video but in the middle of the animation the view becomes a bit white (or whatever the background color is under the cross fading views). It happens because the old view alpha is at 0.5 and the new view alpha is at 0.5 too so the background color behind those 2 views become visible. To avoid this we can just animate the alpha of the new view and just keep the old one around untill the animation is over.

As for the Android implementation I haven't looked at it yet so I have no idea if it's going to be simple or not.

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 22, 2016

Contributor

Hmm, that makes sense for views that perfectly overlap, but not sure how often that would be the case. Having that crossfade option would be handy there though.

On Apr 22, 2016, at 9:01 AM, Janic Duplessis <notifications@github.commailto:notifications@github.com> wrote:

It's hard to see in the video but in the middle of the animation the view becomes a bit white (or whatever the background color is under the cross fading views). It happens because the old view alpha is at 0.5 and the new view alpha is at 0.5 too so the background color behind those 2 views become visible. To avoid this we can just animate the alpha of the new view and just keep the old one around untill the animation is over.

As for the Android implementation I haven't looked at it yet so I have no idea if it's going to be simple or not.


You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHubhttps://github.com/facebook/react-native/pull/6779#issuecomment-213490428

Contributor

sahrens commented Apr 22, 2016

Hmm, that makes sense for views that perfectly overlap, but not sure how often that would be the case. Having that crossfade option would be handy there though.

On Apr 22, 2016, at 9:01 AM, Janic Duplessis <notifications@github.commailto:notifications@github.com> wrote:

It's hard to see in the video but in the middle of the animation the view becomes a bit white (or whatever the background color is under the cross fading views). It happens because the old view alpha is at 0.5 and the new view alpha is at 0.5 too so the background color behind those 2 views become visible. To avoid this we can just animate the alpha of the new view and just keep the old one around untill the animation is over.

As for the Android implementation I haven't looked at it yet so I have no idea if it's going to be simple or not.


You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHubhttps://github.com/facebook/react-native/pull/6779#issuecomment-213490428

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot commented Apr 22, 2016

@janicduplessis updated the pull request.

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 22, 2016

Collaborator

Fixed the nits and also added userInterationEnabled = NO during the delete animation since JS doesn't receive the events anyway it could be confusing if you click on a switch and it moves but JS never received anything.

Collaborator

janicduplessis commented Apr 22, 2016

Fixed the nits and also added userInterationEnabled = NO during the delete animation since JS doesn't receive the events anyway it could be confusing if you click on a switch and it moves but JS never received anything.

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 22, 2016

Contributor

Awesome, thanks!

@facebook-github-bot shipit

Contributor

sahrens commented Apr 22, 2016

Awesome, thanks!

@facebook-github-bot shipit

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot Apr 22, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

facebook-github-bot commented Apr 22, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot Apr 22, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

facebook-github-bot commented Apr 22, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

@sahrens

This comment has been minimized.

Show comment
Hide comment
@sahrens

sahrens Apr 23, 2016

Contributor

Looked like tests failed - can you rebase and if there are still errors, fix them?

Contributor

sahrens commented Apr 23, 2016

Looked like tests failed - can you rebase and if there are still errors, fix them?

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot commented Apr 23, 2016

@janicduplessis updated the pull request.

@janicduplessis

This comment has been minimized.

Show comment
Hide comment
@janicduplessis

janicduplessis Apr 25, 2016

Collaborator

Travis tests seems fine now lets try it again.

@facebook-github-bot shipit

Collaborator

janicduplessis commented Apr 25, 2016

Travis tests seems fine now lets try it again.

@facebook-github-bot shipit

@facebook-github-bot

This comment has been minimized.

Show comment
Hide comment
@facebook-github-bot

facebook-github-bot Apr 25, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

facebook-github-bot commented Apr 25, 2016

Thanks for importing. If you are an FB employee go to Phabricator to review.

@ghost ghost closed this in baa3668 Apr 25, 2016

ptmt added a commit to ptmt/react-native that referenced this pull request May 9, 2016

Add support for delete animation in LayoutAnimation on iOS
Summary:This adds support for delete view animations in LayoutAnimation for iOS. It supports the same properties as the create animation (alpha, scale).

This allows making simple animations when removing a view which is normally hard to do in React since we need to not remove the view node immediately.

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Also tested that the completion callback still works properly. Tested that user interation during the animation is properly disabled.

![layout-anim2](https://cloud.githubusercontent.com/assets/2677334/14595471/86fb1654-050d-11e6-8b38-fe45cc2dcd71.gif)

I also plan to work on improving the doc for LayoutAnimation as well as making this PR for android too.
Closes facebook#6779

Differential Revision: D3215525

Pulled By: sahrens

fb-gh-sync-id: 526120acd371c8d1af433e8f199cfed336183775
fbshipit-source-id: 526120acd371c8d1af433e8f199cfed336183775

ghost pushed a commit that referenced this pull request May 26, 2016

Add support for delete animation in LayoutAnimation on Android
Summary:
Android follow up to #6779

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Tested that user interation during the animation is properly disabled.

![layout-anim-2](https://cloud.githubusercontent.com/assets/2677334/14760549/d60ebe2a-0914-11e6-8f17-ea04d8bf813b.gif)
Closes #7171

Differential Revision: D3352450

Pulled By: astreet

fbshipit-source-id: 233efa041626eb26d99511d12a924e54a10f96cc

zebulgar added a commit to nightingale/react-native that referenced this pull request Jun 18, 2016

Add support for delete animation in LayoutAnimation on iOS
Summary:This adds support for delete view animations in LayoutAnimation for iOS. It supports the same properties as the create animation (alpha, scale).

This allows making simple animations when removing a view which is normally hard to do in React since we need to not remove the view node immediately.

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Also tested that the completion callback still works properly. Tested that user interation during the animation is properly disabled.

![layout-anim2](https://cloud.githubusercontent.com/assets/2677334/14595471/86fb1654-050d-11e6-8b38-fe45cc2dcd71.gif)

I also plan to work on improving the doc for LayoutAnimation as well as making this PR for android too.
Closes facebook#6779

Differential Revision: D3215525

Pulled By: sahrens

fb-gh-sync-id: 526120acd371c8d1af433e8f199cfed336183775
fbshipit-source-id: 526120acd371c8d1af433e8f199cfed336183775

samerce added a commit to iodine/react-native that referenced this pull request Aug 23, 2016

Add support for delete animation in LayoutAnimation on iOS
Summary:This adds support for delete view animations in LayoutAnimation for iOS. It supports the same properties as the create animation (alpha, scale).

This allows making simple animations when removing a view which is normally hard to do in React since we need to not remove the view node immediately.

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Also tested that the completion callback still works properly. Tested that user interation during the animation is properly disabled.

![layout-anim2](https://cloud.githubusercontent.com/assets/2677334/14595471/86fb1654-050d-11e6-8b38-fe45cc2dcd71.gif)

I also plan to work on improving the doc for LayoutAnimation as well as making this PR for android too.
Closes facebook#6779

Differential Revision: D3215525

Pulled By: sahrens

fb-gh-sync-id: 526120acd371c8d1af433e8f199cfed336183775
fbshipit-source-id: 526120acd371c8d1af433e8f199cfed336183775

samerce added a commit to iodine/react-native that referenced this pull request Aug 23, 2016

Add support for delete animation in LayoutAnimation on Android
Summary:
Android follow up to #6779

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Tested that user interation during the animation is properly disabled.

![layout-anim-2](https://cloud.githubusercontent.com/assets/2677334/14760549/d60ebe2a-0914-11e6-8f17-ea04d8bf813b.gif)
Closes facebook#7171

Differential Revision: D3352450

Pulled By: astreet

fbshipit-source-id: 233efa041626eb26d99511d12a924e54a10f96cc

mpretty-cyro pushed a commit to HomePass/react-native that referenced this pull request Aug 25, 2016

Add support for delete animation in LayoutAnimation on Android
Summary:
Android follow up to #6779

**Test plan**
Tested add/removing views in the UIExample explorer with and without setting a LayoutAnimation. Tested that user interation during the animation is properly disabled.

![layout-anim-2](https://cloud.githubusercontent.com/assets/2677334/14760549/d60ebe2a-0914-11e6-8f17-ea04d8bf813b.gif)
Closes facebook#7171

Differential Revision: D3352450

Pulled By: astreet

fbshipit-source-id: 233efa041626eb26d99511d12a924e54a10f96cc

This issue was closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment