Files
react-native-reanimated/ios/Transitioning/REATransitionManager.m
2019-04-04 09:27:15 +02:00

63 lines
1.8 KiB
Objective-C

#import "REATransitionManager.h"
#import <React/RCTUIManager.h>
#import <React/RCTUIManagerObserverCoordinator.h>
#import "REATransition.h"
@interface REATransitionManager () <RCTUIManagerObserver>
@end
@implementation REATransitionManager {
REATransition *_pendingTransition;
UIView *_pendingTransitionRoot;
RCTUIManager *_uiManager;
}
- (instancetype)initWithUIManager:(id)uiManager
{
if (self = [super init]) {
_uiManager = uiManager;
}
return self;
}
- (void)beginTransition:(REATransition *)transition forView:(UIView *)view
{
RCTAssertMainQueue();
if (_pendingTransition != nil) {
return;
}
_pendingTransition = transition;
_pendingTransitionRoot = view;
[transition startCaptureInRoot:view];
}
- (void)uiManagerWillPerformMounting:(RCTUIManager *)manager
{
[manager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
[_pendingTransition playInRoot:_pendingTransitionRoot];
_pendingTransitionRoot = nil;
_pendingTransition = nil;
}];
}
- (void)animateNextTransitionInRoot:(NSNumber *)reactTag withConfig:(NSDictionary *)config
{
[_uiManager.observerCoordinator addObserver:self];
[_uiManager prependUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
UIView *view = viewRegistry[reactTag];
NSArray *transitionConfigs = [RCTConvert NSArray:config[@"transitions"]];
for (id transitionConfig in transitionConfigs) {
REATransition *transition = [REATransition inflate:transitionConfig];
[self beginTransition:transition forView:view];
}
}];
__weak id weakSelf = self;
[_uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
[uiManager.observerCoordinator removeObserver:weakSelf];
}];
}
@end