Skip to content

Commit 974219b

Browse files
committed
BUGFIX: fixed view controller handling (issue 6)
1 parent 9b55a8a commit 974219b

File tree

3 files changed

+77
-31
lines changed

3 files changed

+77
-31
lines changed

FRLayeredNavigationController/FRLayerController.h

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
FRLayerChromeView *_chromeView;
4141
UIView *_borderView;
42+
UIView __weak *_contentView;
4243

4344
UIViewController *_contentViewController;
4445
}

FRLayeredNavigationController/FRLayerController.m

+45-17
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ @interface FRLayerController ()
4343

4444
@property (nonatomic, strong) FRLayerChromeView *chromeView;
4545
@property (nonatomic, strong) UIView *borderView;
46+
@property (nonatomic, weak) UIView *contentView;
4647

4748
@end
4849

@@ -56,8 +57,6 @@ - (id)initWithContentViewController:(UIViewController *)vc maximumWidth:(BOOL)ma
5657
_layeredNavigationItem.layerController = self;
5758
_contentViewController = vc;
5859
_maximumWidth = maxWidth;
59-
60-
[self attachContentViewController];
6160
}
6261

6362
return self;
@@ -66,12 +65,10 @@ - (id)initWithContentViewController:(UIViewController *)vc maximumWidth:(BOOL)ma
6665
- (void)dealloc
6766
{
6867
self.layeredNavigationItem.layerController = nil;
69-
[self detachContentViewController];
7068
}
7169

7270
#pragma mark - internal methods
7371

74-
7572
- (void)doViewLayout {
7673
CGRect contentFrame = CGRectZero;
7774

@@ -98,20 +95,9 @@ - (void)doViewLayout {
9895
}
9996

10097

101-
self.contentViewController.view.frame = contentFrame;
98+
self.contentView.frame = contentFrame;
10299
}
103100

104-
- (void)attachContentViewController
105-
{
106-
[self addChildViewController:self.contentViewController];
107-
[self.contentViewController didMoveToParentViewController:self];
108-
}
109-
110-
- (void)detachContentViewController
111-
{
112-
[self.contentViewController willMoveToParentViewController:nil];
113-
[self.contentViewController removeFromParentViewController];
114-
}
115101

116102
#pragma mark - UIViewController interface methods
117103

@@ -133,7 +119,15 @@ - (void)loadView {
133119
[self.view addSubview:self.chromeView];
134120
[self.view addSubview:self.borderView];
135121
}
136-
[self.view addSubview:self.contentViewController.view];
122+
123+
if (self.contentView == nil && self.contentViewController.parentViewController == self) {
124+
/* when loaded again after a low memory view removal */
125+
self.contentView = self.contentViewController.view;
126+
}
127+
128+
if (self.contentView != nil) {
129+
[self.view addSubview:self.contentView];
130+
}
137131
}
138132

139133
- (void)viewWillLayoutSubviews {
@@ -155,17 +149,51 @@ - (void)viewDidUnload
155149

156150
self.borderView = nil;
157151
self.chromeView = nil;
152+
self.contentView = nil;
158153
}
159154

160155
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
161156
{
162157
return YES;
163158
}
164159

160+
- (void)willMoveToParentViewController:(UIViewController *)parent
161+
{
162+
[super willMoveToParentViewController:parent];
163+
164+
if (parent != nil) {
165+
/* will shortly attach to parent */
166+
[self addChildViewController:self.contentViewController];
167+
168+
self.contentView = self.contentViewController.view;
169+
[self.view addSubview:self.contentView];
170+
} else {
171+
/* will shortly detach from parent view controller */
172+
[self.contentViewController willMoveToParentViewController:nil];
173+
174+
[self.contentView removeFromSuperview];
175+
self.contentView = nil;
176+
}
177+
}
178+
179+
- (void)didMoveToParentViewController:(UIViewController *)parent
180+
{
181+
[super didMoveToParentViewController:parent];
182+
183+
if (parent != nil) {
184+
/* just attached to parent view controller */
185+
[self.contentViewController didMoveToParentViewController:self];
186+
} else {
187+
/* did just detach */
188+
[self.contentViewController removeFromParentViewController];
189+
}
190+
}
191+
165192
@synthesize contentViewController = _contentViewController;
166193
@synthesize maximumWidth = _maximumWidth;
167194
@synthesize borderView = _borderView;
168195
@synthesize chromeView = _chromeView;
169196
@synthesize layeredNavigationItem = _layeredNavigationItem;
197+
@synthesize contentView = _contentView;
170198

171199
@end

FRLayeredNavigationController/FRLayeredNavigationController.m

+31-14
Original file line numberDiff line numberDiff line change
@@ -500,20 +500,32 @@ - (void)popViewControllerAnimated:(BOOL)animated
500500
return;
501501
}
502502

503-
[vc willMoveToParentViewController:nil];
504503
[self.viewControllers removeObject:vc];
505504

506-
CGRect goAwayFrame = CGRectMake(vc.view.frame.origin.x, 1024, vc.view.bounds.size.width, vc.view.bounds.size.height);
507-
[UIView animateWithDuration:animated ? 0.5 : 0
508-
delay:0
509-
options: UIViewAnimationCurveLinear
510-
animations:^{
511-
vc.view.frame = goAwayFrame;
512-
}
513-
completion:^(BOOL finished) {
514-
[vc.view removeFromSuperview];
515-
[vc removeFromParentViewController];
516-
}];
505+
CGRect goAwayFrame = CGRectMake(vc.view.frame.origin.x,
506+
1024,
507+
vc.view.bounds.size.width,
508+
vc.view.bounds.size.height);
509+
510+
void (^completeViewRemoval)(BOOL) = ^(BOOL finished) {
511+
[vc willMoveToParentViewController:nil];
512+
513+
[vc.view removeFromSuperview];
514+
515+
[vc removeFromParentViewController];
516+
};
517+
518+
if (animated) {
519+
[UIView animateWithDuration:0.5
520+
delay:0
521+
options: UIViewAnimationCurveLinear
522+
animations:^{
523+
vc.view.frame = goAwayFrame;
524+
}
525+
completion:completeViewRemoval];
526+
} else {
527+
completeViewRemoval(YES);
528+
}
517529
}
518530

519531
- (void)popToViewController:(UIViewController *)vc animated:(BOOL)animated
@@ -556,7 +568,12 @@ - (void)pushViewController:(UIViewController *)contentViewController
556568
self.view.bounds.size.width :
557569
[self getScreenBoundsForCurrentOrientation].size.width;
558570

559-
[self popToViewController:anchorViewController animated:animated];
571+
if (contentViewController.parentViewController.parentViewController == self) {
572+
/* no animation if the new content view controller is already a child of self */
573+
[self popToViewController:anchorViewController animated:NO];
574+
} else {
575+
[self popToViewController:anchorViewController animated:animated];
576+
}
560577

561578
CGFloat anchorInitX = anchorViewController.layeredNavigationItem.initialViewPosition.x;
562579
CGFloat anchorCurrentX = anchorViewController.layeredNavigationItem.currentViewPosition.x;
@@ -594,7 +611,6 @@ - (void)pushViewController:(UIViewController *)contentViewController
594611
[self.viewControllers addObject:newVC];
595612
[self addChildViewController:newVC];
596613
[self.view addSubview:newVC.view];
597-
[newVC didMoveToParentViewController:self];
598614

599615
[UIView animateWithDuration:animated ? 0.5 : 0
600616
delay:0
@@ -609,6 +625,7 @@ - (void)pushViewController:(UIViewController *)contentViewController
609625

610626
}
611627
completion:^(BOOL finished) {
628+
[newVC didMoveToParentViewController:self];
612629
}];
613630
}
614631

0 commit comments

Comments
 (0)