Skip to content

Commit 9a79c2b

Browse files
committed
Interactive pop
Former-commit-id: 623322a
1 parent 0fefa33 commit 9a79c2b

File tree

5 files changed

+107
-18
lines changed

5 files changed

+107
-18
lines changed

MVVMReactiveCocoa/View/BaseClass/MRCNavigationControllerStack.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ - (void)registerNavigationHooks {
6565
rac_signalForSelector:@selector(pushViewModel:animated:)]
6666
subscribeNext:^(RACTuple *tuple) {
6767
@strongify(self)
68+
MRCViewController *topViewController = (MRCViewController *)[self.navigationControllers.lastObject topViewController];
69+
topViewController.snapshot = [[self.navigationControllers.lastObject view] snapshotViewAfterScreenUpdates:NO];
70+
6871
UIViewController *viewController = (UIViewController *)[MRCRouter.sharedInstance viewControllerForViewModel:tuple.first];
6972
viewController.hidesBottomBarWhenPushed = YES;
7073
[self.navigationControllers.lastObject pushViewController:viewController animated:[tuple.second boolValue]];
@@ -74,7 +77,10 @@ - (void)registerNavigationHooks {
7477
rac_signalForSelector:@selector(popViewModelAnimated:)]
7578
subscribeNext:^(RACTuple *tuple) {
7679
@strongify(self)
77-
[self.navigationControllers.lastObject popViewControllerAnimated:[tuple.first boolValue]];
80+
// MRCViewController *topViewController = (MRCViewController *)[self.navigationControllers.lastObject topViewController];
81+
// topViewController.snapshot = [[self.navigationControllers.lastObject view] snapshotViewAfterScreenUpdates:NO];
82+
83+
[self.navigationControllers.lastObject popViewControllerAnimated:[tuple.first boolValue]];
7884
}];
7985

8086
[[(NSObject *)self.services

MVVMReactiveCocoa/View/BaseClass/MRCTableViewController.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ - (void)viewDidLoad {
109109
self.tableView.tableFooterView = [[UIView alloc] init];
110110
}
111111

112-
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
113-
[self.tableView addGestureRecognizer:gestureRecognizer];
114-
}
112+
//- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
113+
// [self.tableView addGestureRecognizer:gestureRecognizer];
114+
//}
115115

116116
- (void)dealloc {
117117
_tableView.dataSource = nil;

MVVMReactiveCocoa/View/BaseClass/MRCViewController.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
/// The `viewModel` parameter in `-initWithViewModel:` method.
1212
@property (nonatomic, strong, readonly) MRCViewModel *viewModel;
1313

14+
@property (nonatomic, strong, readonly) UINavigationBar *navigationBar;
1415
@property (nonatomic, strong, readonly) UIPercentDrivenInteractiveTransition *interactivePopTransition;
16+
@property (nonatomic, strong) UIView *snapshot;
1517

1618
/// Initialization method. This is the preferred way to create a new view.
1719
///

MVVMReactiveCocoa/View/BaseClass/MRCViewController.m

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
@interface MRCViewController ()
1616

1717
@property (nonatomic, strong, readwrite) MRCViewModel *viewModel;
18+
@property (nonatomic, strong, readwrite) UINavigationBar *navigationBar;
1819
@property (nonatomic, strong, readwrite) UIPercentDrivenInteractiveTransition *interactivePopTransition;
20+
//@property (nonatomic, strong, readwrite) UIView *snapshot;
1921

2022
@end
2123

@@ -49,14 +51,32 @@ - (void)viewDidLoad {
4951
self.automaticallyAdjustsScrollViewInsets = NO;
5052
self.extendedLayoutIncludesOpaqueBars = YES;
5153

54+
// self.navigationBar = ({
55+
// UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 20, SCREEN_WIDTH, 44)];
56+
//
57+
// UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:self.viewModel.title];
58+
// [navigationBar pushNavigationItem:navigationItem animated:YES];
59+
// [self.view addSubview:navigationBar];
60+
//
61+
// UIImage *image = [UIImage octicon_imageWithIcon:@""
62+
// backgroundColor:[UIColor colorWithRed:(48 - 40) / 215.0 green:(67 - 40) / 215.0 blue:(78 - 40) / 215.0 alpha:1]
63+
// iconColor:[UIColor clearColor]
64+
// iconScale:1
65+
// andSize:CGSizeMake(SCREEN_WIDTH, 64)];
66+
// [navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
67+
//
68+
// navigationBar;
69+
// });
70+
5271
UIScreenEdgePanGestureRecognizer *popRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePopRecognizer:)];
5372
popRecognizer.edges = UIRectEdgeLeft;
54-
[self addGestureRecognizer:popRecognizer];
73+
[self.view addGestureRecognizer:popRecognizer];
74+
// [self addGestureRecognizer:popRecognizer];
5575
}
5676

57-
- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer {
58-
[self.view addGestureRecognizer:gestureRecognizer];
59-
}
77+
//- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer {
78+
// [self.view addGestureRecognizer:gestureRecognizer];
79+
//}
6080

6181
- (void)bindViewModel {
6282
// System title view
@@ -122,7 +142,15 @@ - (void)bindViewModel {
122142

123143
- (void)viewWillDisappear:(BOOL)animated {
124144
[super viewWillDisappear:animated];
145+
125146
[self.viewModel.willDisappearSignal sendNext:nil];
147+
148+
if ([self isMovingFromParentViewController]) {
149+
self.snapshot = [self.navigationController.view snapshotViewAfterScreenUpdates:NO];
150+
}
151+
152+
// NSLog(@"isMovingToParentViewController: %@", @([self isMovingToParentViewController]));
153+
// NSLog(@"isMovingFromParentViewController: %@", @([self isMovingFromParentViewController]));
126154
}
127155

128156
- (BOOL)shouldAutorotate {
@@ -147,12 +175,13 @@ - (void)handlePopRecognizer:(UIScreenEdgePanGestureRecognizer *)recognizer {
147175
// Create a interactive transition and pop the view controller
148176
self.interactivePopTransition = [[UIPercentDrivenInteractiveTransition alloc] init];
149177
[self.navigationController popViewControllerAnimated:YES];
178+
// [self.viewModel.services popViewModelAnimated:YES];
150179
} else if (recognizer.state == UIGestureRecognizerStateChanged) {
151180
// Update the interactive transition's progress
152181
[self.interactivePopTransition updateInteractiveTransition:progress];
153182
} else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled) {
154183
// Finish or cancel the interactive transition
155-
if (progress > 0.5) {
184+
if (progress > 0.3) {
156185
[self.interactivePopTransition finishInteractiveTransition];
157186
} else {
158187
[self.interactivePopTransition cancelInteractiveTransition];

MVVMReactiveCocoa/View/Transition/MRCViewControllerAnimatedTransition.m

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ - (instancetype)initWithNavigationControllerOperation:(UINavigationControllerOpe
3131
}
3232

3333
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
34-
return 0.3;
34+
return 0.25;
3535
}
3636

3737
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
38-
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
39-
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
38+
MRCViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
39+
MRCViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
4040

4141
CGRect initialFrameForFromViewController = [transitionContext initialFrameForViewController:fromViewController];
4242
CGRect finalFrameForFromViewController = [transitionContext finalFrameForViewController:fromViewController];
@@ -53,32 +53,84 @@ - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionCo
5353
NSTimeInterval duration = [self transitionDuration:transitionContext];
5454

5555
if (self.operation == UINavigationControllerOperationPush) { // push
56+
[[transitionContext containerView] addSubview:fromViewController.snapshot];
57+
fromViewController.view.hidden = YES;
58+
5659
CGRect frame = [transitionContext finalFrameForViewController:toViewController];
5760
toViewController.view.frame = CGRectOffset(frame, CGRectGetWidth(frame), 0);
5861
[[transitionContext containerView] addSubview:toViewController.view];
5962

6063
[UIView animateWithDuration:duration
64+
delay:0.0
65+
options:UIViewAnimationOptionCurveEaseOut
6166
animations:^{
62-
fromViewController.view.alpha = 0;
63-
// fromViewController.view.frame = CGRectInset(fromViewController.view.frame, 10, 10);
67+
fromViewController.snapshot.alpha = 0.0;
6468
toViewController.view.frame = CGRectOffset(toViewController.view.frame, -CGRectGetWidth(toViewController.view.frame), 0);
69+
// toViewController.navigationController.navigationBar.frame = CGRectOffset(toViewController.navigationController.navigationBar.frame, -CGRectGetWidth(toViewController.navigationController.navigationBar.frame), 0);
6570
}
6671
completion:^(BOOL finished) {
72+
fromViewController.view.hidden = NO;
73+
[fromViewController.snapshot removeFromSuperview];
6774
[transitionContext completeTransition:YES];
6875
}];
6976
} else if (self.operation == UINavigationControllerOperationPop) { // pop
77+
// fromViewController.view.hidden = YES;
78+
toViewController.view.hidden = YES;
79+
7080
[[transitionContext containerView] addSubview:toViewController.view];
71-
[[transitionContext containerView] sendSubviewToBack:toViewController.view];
72-
81+
[[transitionContext containerView] addSubview:toViewController.snapshot];
82+
[[transitionContext containerView] sendSubviewToBack:toViewController.snapshot];
83+
84+
toViewController.snapshot.frame = CGRectInset(toViewController.view.frame, 20, 20);
85+
86+
[fromViewController.view addSubview:fromViewController.snapshot];
87+
88+
// UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 250, SCREEN_WIDTH, 44)];
89+
// view.backgroundColor = [UIColor blueColor];
90+
// [fromViewController.view addSubview:view];
91+
// [[transitionContext containerView] addSubview:fromViewController.snapshot];
92+
93+
fromViewController.navigationController.navigationBar.hidden = YES;
94+
95+
// toViewController.snapshot.alpha = 0.0;
96+
7397
[UIView animateWithDuration:duration
98+
delay:0.0
99+
options:UIViewAnimationOptionCurveLinear
74100
animations:^{
101+
// fromViewController.navigationController.navigationBar.frame = CGRectOffset(fromViewController.navigationController.navigationBar.frame, CGRectGetWidth(fromViewController.view.frame), 0);
75102
fromViewController.view.frame = CGRectOffset(fromViewController.view.frame, CGRectGetWidth(fromViewController.view.frame), 0);
76-
toViewController.view.alpha = 1;
77-
// toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
103+
// fromViewController.snapshot.frame = CGRectOffset(fromViewController.snapshot.frame, CGRectGetWidth(fromViewController.snapshot.frame), 0);
104+
105+
// fromViewController.snapshot.frame = CGRectOffset(fromViewController.snapshot.frame, 0, 0);
106+
toViewController.snapshot.alpha = 1.0;
107+
toViewController.snapshot.frame = [transitionContext finalFrameForViewController:toViewController];
78108
}
79109
completion:^(BOOL finished) {
110+
toViewController.navigationController.navigationBar.hidden = NO;
111+
112+
fromViewController.view.hidden = NO;
113+
toViewController.view.hidden = NO;
114+
115+
[fromViewController.snapshot removeFromSuperview];
116+
[toViewController.snapshot removeFromSuperview];
117+
118+
// if (![transitionContext transitionWasCancelled]) {
119+
// toViewController.navigationController.navigationBar.frame = CGRectOffset(toViewController.navigationController.navigationBar.frame, -CGRectGetWidth(toViewController.view.frame), 0);
120+
// }
121+
80122
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
81123
}];
124+
// [UIView animateWithDuration:duration
125+
// animations:^{
126+
//// fromViewController.navigationController.navigationBar.frame = CGRectOffset(fromViewController.navigationController.navigationBar.frame, CGRectGetWidth(fromViewController.view.frame), 0);
127+
// fromViewController.view.frame = CGRectOffset(fromViewController.view.frame, CGRectGetWidth(fromViewController.view.frame), 0);
128+
// toViewController.view.alpha = 1;
129+
//// toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];
130+
// }
131+
// completion:^(BOOL finished) {
132+
// [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
133+
// }];
82134
}
83135
}
84136

0 commit comments

Comments
 (0)