diff --git a/lib/ios/RNNAnimationsOptions.h b/lib/ios/RNNAnimationsOptions.h index 5c88399b54a..55865f1e44a 100644 --- a/lib/ios/RNNAnimationsOptions.h +++ b/lib/ios/RNNAnimationsOptions.h @@ -1,7 +1,6 @@ #import "RNNOptions.h" #import "RNNScreenTransition.h" #import "TransitionOptions.h" -#import "ViewAnimationOptions.h" @interface RNNAnimationsOptions : RNNOptions diff --git a/lib/ios/RNNComponentPresenter.m b/lib/ios/RNNComponentPresenter.m index c43095cc8bc..fc5c18fb7df 100644 --- a/lib/ios/RNNComponentPresenter.m +++ b/lib/ios/RNNComponentPresenter.m @@ -84,8 +84,8 @@ - (void)applyOptions:(RNNNavigationOptions *)options { withDefault:nil] tintColor:[options.topBar.searchBar.tintColor withDefault:nil] - cancelText:[withDefault.topBar.searchBar.cancelText - withDefault:nil]]; + cancelText:[withDefault.topBar.searchBar.cancelText + withDefault:nil]]; } [_topBarTitlePresenter applyOptions:withDefault.topBar]; @@ -148,8 +148,8 @@ - (void)mergeOptions:(RNNNavigationOptions *)mergeOptions withDefault:nil] tintColor:[mergeOptions.topBar.searchBar.tintColor withDefault:nil] - cancelText:[withDefault.topBar.searchBar.cancelText - withDefault:nil]]; + cancelText:[withDefault.topBar.searchBar.cancelText + withDefault:nil]]; } else { [viewController setSearchBarVisible:NO]; } diff --git a/lib/ios/RNNEnterExitAnimation.h b/lib/ios/RNNEnterExitAnimation.h index 4f4dac3c7db..f4d9676df20 100644 --- a/lib/ios/RNNEnterExitAnimation.h +++ b/lib/ios/RNNEnterExitAnimation.h @@ -1,8 +1,12 @@ +#import "RNNEnterExitAnimation.h" +#import "SharedElementTransitionOptions.h" #import "TransitionOptions.h" #import @interface RNNEnterExitAnimation : RNNOptions +@property(nonatomic, strong) NSArray *elementTransitions; +@property(nonatomic, strong) NSArray *sharedElementTransitions; @property(nonatomic, strong) TransitionOptions *enter; @property(nonatomic, strong) TransitionOptions *exit; diff --git a/lib/ios/RNNEnterExitAnimation.m b/lib/ios/RNNEnterExitAnimation.m index 5da7c59e29a..e1e6521362c 100644 --- a/lib/ios/RNNEnterExitAnimation.m +++ b/lib/ios/RNNEnterExitAnimation.m @@ -1,4 +1,5 @@ #import "RNNEnterExitAnimation.h" +#import "OptionsArrayParser.h" @implementation RNNEnterExitAnimation @@ -7,7 +8,12 @@ - (instancetype)initWithDict:(NSDictionary *)dict { self.enter = [[TransitionOptions alloc] initWithDict:dict[@"enter"]]; self.exit = [[TransitionOptions alloc] initWithDict:dict[@"exit"]]; - + self.sharedElementTransitions = [OptionsArrayParser parse:dict + key:@"sharedElementTransitions" + ofClass:SharedElementTransitionOptions.class]; + self.elementTransitions = [OptionsArrayParser parse:dict + key:@"elementTransitions" + ofClass:ElementTransitionOptions.class]; return self; } @@ -16,10 +22,15 @@ - (void)mergeOptions:(RNNEnterExitAnimation *)options { self.enter = options.enter; if (options.exit.hasValue) self.exit = options.exit; + if (options.sharedElementTransitions) + self.sharedElementTransitions = options.sharedElementTransitions; + if (options.elementTransitions) + self.elementTransitions = options.elementTransitions; } - (BOOL)hasAnimation { - return self.enter.hasAnimation || self.exit.hasAnimation; + return self.enter.hasAnimation || self.exit.hasAnimation || self.elementTransitions || + self.sharedElementTransitions; } - (NSTimeInterval)maxDuration { @@ -29,6 +40,18 @@ - (NSTimeInterval)maxDuration { if (self.exit.maxDuration > maxDuration) maxDuration = self.exit.maxDuration; + for (ElementTransitionOptions *elementTransition in self.elementTransitions) { + if (elementTransition.maxDuration > maxDuration) { + maxDuration = elementTransition.maxDuration; + } + } + + for (SharedElementTransitionOptions *sharedElementTransition in self.sharedElementTransitions) { + if (sharedElementTransition.maxDuration > maxDuration) { + maxDuration = sharedElementTransition.maxDuration; + } + } + return maxDuration; } diff --git a/lib/ios/RNNModalManager.m b/lib/ios/RNNModalManager.m index c6f41d6e967..c50ef61983d 100644 --- a/lib/ios/RNNModalManager.m +++ b/lib/ios/RNNModalManager.m @@ -4,7 +4,6 @@ #import "ScreenAnimationController.h" #import "ScreenReversedAnimationController.h" #import "UIViewController+LayoutProtocol.h" -#import "ViewAnimationOptions.h" @interface RNNModalManager () @property(nonatomic, strong) ScreenAnimationController *showModalTransitionDelegate; @@ -73,13 +72,13 @@ - (void)showModal:(UIViewController *)viewController } if (viewController.resolveOptionsWithDefault.animations.showModal.hasAnimation) { - ViewAnimationOptions *viewAnimationOptions = + RNNEnterExitAnimation *enterExitAnimationOptions = viewController.resolveOptionsWithDefault.animations.showModal; _showModalTransitionDelegate = [[ScreenAnimationController alloc] - initWithContentTransition:viewAnimationOptions - elementTransitions:viewAnimationOptions.elementTransitions - sharedElementTransitions:viewAnimationOptions.sharedElementTransitions - duration:viewAnimationOptions.maxDuration + initWithContentTransition:enterExitAnimationOptions + elementTransitions:enterExitAnimationOptions.elementTransitions + sharedElementTransitions:enterExitAnimationOptions.sharedElementTransitions + duration:enterExitAnimationOptions.maxDuration bridge:_bridge]; viewController.transitioningDelegate = _showModalTransitionDelegate; @@ -108,7 +107,7 @@ - (void)dismissModal:(UIViewController *)viewController - (void)dismissAllModalsAnimated:(BOOL)animated completion:(void (^__nullable)(void))completion { UIViewController *root = [self rootViewController]; if (root.presentedViewController) { - ViewAnimationOptions *dismissModalOptions = + RNNEnterExitAnimation *dismissModalOptions = root.presentedViewController.resolveOptionsWithDefault.animations.dismissModal; if (dismissModalOptions.hasAnimation) { _dismissModalTransitionDelegate = [[ScreenAnimationController alloc] @@ -158,13 +157,13 @@ - (void)removePendingNextModalIfOnTop:(RNNTransitionCompletionBlock)completion UIViewController *topPresentedVC = [self topPresentedVC]; if (optionsWithDefault.animations.dismissModal.hasAnimation) { - ViewAnimationOptions *viewAnimationOptions = + RNNEnterExitAnimation *enterExitAnimationOptions = modalToDismiss.resolveOptionsWithDefault.animations.dismissModal; _dismissModalTransitionDelegate = [[ScreenReversedAnimationController alloc] - initWithContentTransition:viewAnimationOptions - elementTransitions:viewAnimationOptions.elementTransitions - sharedElementTransitions:viewAnimationOptions.sharedElementTransitions - duration:viewAnimationOptions.maxDuration + initWithContentTransition:enterExitAnimationOptions + elementTransitions:enterExitAnimationOptions.elementTransitions + sharedElementTransitions:enterExitAnimationOptions.sharedElementTransitions + duration:enterExitAnimationOptions.maxDuration bridge:_bridge]; [self topViewControllerParent:modalToDismiss].transitioningDelegate = diff --git a/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj b/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj index c95bafab7fd..cddd07d5308 100644 --- a/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj +++ b/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj @@ -309,8 +309,6 @@ 50AD1CE123CB428400FF3134 /* TransitionOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 50AD1CDF23CB428400FF3134 /* TransitionOptions.m */; }; 50AD288823CDB71C00FF3134 /* ElementHorizontalTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 50AD288623CDB71C00FF3134 /* ElementHorizontalTransition.h */; }; 50AD288923CDB71C00FF3134 /* ElementHorizontalTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 50AD288723CDB71C00FF3134 /* ElementHorizontalTransition.m */; }; - 50B92C26253DDC6D0056FC26 /* ViewAnimationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 50B92C24253DDC6D0056FC26 /* ViewAnimationOptions.h */; }; - 50B92C27253DDC6D0056FC26 /* ViewAnimationOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 50B92C25253DDC6D0056FC26 /* ViewAnimationOptions.m */; }; 50BAFE4B2399405800798674 /* RNNExternalViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 50BAFE492399405800798674 /* RNNExternalViewController.h */; }; 50BAFE4C2399405800798674 /* RNNExternalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 50BAFE4A2399405800798674 /* RNNExternalViewController.m */; }; 50BCB27123F1650800D6C8E5 /* SharedElementTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 50BCB26F23F1650800D6C8E5 /* SharedElementTransition.h */; }; @@ -843,8 +841,6 @@ 50AD1CDF23CB428400FF3134 /* TransitionOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TransitionOptions.m; sourceTree = ""; }; 50AD288623CDB71C00FF3134 /* ElementHorizontalTransition.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ElementHorizontalTransition.h; sourceTree = ""; }; 50AD288723CDB71C00FF3134 /* ElementHorizontalTransition.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ElementHorizontalTransition.m; sourceTree = ""; }; - 50B92C24253DDC6D0056FC26 /* ViewAnimationOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewAnimationOptions.h; sourceTree = ""; }; - 50B92C25253DDC6D0056FC26 /* ViewAnimationOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewAnimationOptions.m; sourceTree = ""; }; 50BAFE492399405800798674 /* RNNExternalViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNExternalViewController.h; sourceTree = ""; }; 50BAFE4A2399405800798674 /* RNNExternalViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNExternalViewController.m; sourceTree = ""; }; 50BCB26F23F1650800D6C8E5 /* SharedElementTransition.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SharedElementTransition.h; sourceTree = ""; }; @@ -1400,8 +1396,6 @@ children = ( B8B2BB6324FFCC9500FC6575 /* CornerRadiusTransition.h */, B8B2BB6424FFCC9500FC6575 /* CornerRadiusTransition.m */, - 50B92C24253DDC6D0056FC26 /* ViewAnimationOptions.h */, - 50B92C25253DDC6D0056FC26 /* ViewAnimationOptions.m */, 50F72E532607468C0096758A /* PathTransition.h */, 50F72E542607468C0096758A /* PathTransition.m */, 506BF65A2600AE4200A22755 /* CenterTransition.h */, @@ -2032,7 +2026,6 @@ 5038A3B1216DF41B009280BC /* UIViewController+RNNOptions.h in Headers */, 5049595A216F6B46006D2B81 /* NullDictionary.h in Headers */, 50BCB27123F1650800D6C8E5 /* SharedElementTransition.h in Headers */, - 50B92C26253DDC6D0056FC26 /* ViewAnimationOptions.h in Headers */, 50BCB27D23F2A1EE00D6C8E5 /* FloatTransition.h in Headers */, 501224062173592D000F5F98 /* RNNBottomTabsPresenter.h in Headers */, 5017D9F2239D2FCB00B74047 /* BottomTabsOnSwitchToTabAttacher.h in Headers */, @@ -2395,7 +2388,6 @@ 5049593A216E5750006D2B81 /* Bool.m in Sources */, 50F5DFC61F407AA0001A00BC /* RNNStackController.m in Sources */, 21B85E5D1F44480200B314B5 /* RNNButtonsPresenter.m in Sources */, - 50B92C27253DDC6D0056FC26 /* ViewAnimationOptions.m in Sources */, E8E518371F83B94A000467AC /* RNNViewLocation.m in Sources */, E3458D3E20BD9CE40023149B /* RNNPreviewOptions.m in Sources */, 5012242B217372B3000F5F98 /* ImageParser.m in Sources */, diff --git a/lib/ios/ViewAnimationOptions.h b/lib/ios/ViewAnimationOptions.h deleted file mode 100644 index 0332c6ebfd6..00000000000 --- a/lib/ios/ViewAnimationOptions.h +++ /dev/null @@ -1,16 +0,0 @@ -#import "ElementTransitionOptions.h" -#import "RNNEnterExitAnimation.h" -#import "SharedElementTransitionOptions.h" -#import "TransitionOptions.h" - -@interface ViewAnimationOptions : RNNEnterExitAnimation - -@property(nonatomic, strong) NSArray *elementTransitions; -@property(nonatomic, strong) NSArray *sharedElementTransitions; -@property(nonatomic, strong) Bool *waitForRender; - -- (BOOL)shouldWaitForRender; -- (NSTimeInterval)maxDuration; -- (BOOL)hasAnimation; - -@end diff --git a/lib/ios/ViewAnimationOptions.m b/lib/ios/ViewAnimationOptions.m deleted file mode 100644 index 625c1dff94f..00000000000 --- a/lib/ios/ViewAnimationOptions.m +++ /dev/null @@ -1,56 +0,0 @@ -#import "ViewAnimationOptions.h" -#import "OptionsArrayParser.h" - -@implementation ViewAnimationOptions - -- (instancetype)initWithDict:(NSDictionary *)dict { - self = [super initWithDict:dict]; - - self.sharedElementTransitions = [OptionsArrayParser parse:dict - key:@"sharedElementTransitions" - ofClass:SharedElementTransitionOptions.class]; - self.elementTransitions = [OptionsArrayParser parse:dict - key:@"elementTransitions" - ofClass:ElementTransitionOptions.class]; - self.waitForRender = [BoolParser parse:dict key:@"waitForRender"]; - - return self; -} - -- (void)mergeOptions:(ViewAnimationOptions *)options { - [super mergeOptions:options]; - if (options.sharedElementTransitions) - self.sharedElementTransitions = options.sharedElementTransitions; - if (options.elementTransitions) - self.elementTransitions = options.elementTransitions; - if (options.waitForRender.hasValue) - self.waitForRender = options.waitForRender; -} - -- (BOOL)hasAnimation { - return super.hasAnimation || self.sharedElementTransitions || self.elementTransitions; -} - -- (BOOL)shouldWaitForRender { - return [self.waitForRender withDefault:NO] || self.hasAnimation; -} - -- (NSTimeInterval)maxDuration { - NSTimeInterval maxDuration = [super maxDuration]; - - for (ElementTransitionOptions *elementTransition in self.elementTransitions) { - if (elementTransition.maxDuration > maxDuration) { - maxDuration = elementTransition.maxDuration; - } - } - - for (SharedElementTransitionOptions *sharedElementTransition in self.sharedElementTransitions) { - if (sharedElementTransition.maxDuration > maxDuration) { - maxDuration = sharedElementTransition.maxDuration; - } - } - - return maxDuration; -} - -@end