This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.

63 lines
1.8 KiB
Mathematica
Raw Normal View History

2021-04-02 02:24:13 +03:00
#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