diff --git a/FRLayeredNavigationController.xcodeproj/project.pbxproj b/FRLayeredNavigationController.xcodeproj/project.pbxproj index cf8a975..256c2ba 100644 --- a/FRLayeredNavigationController.xcodeproj/project.pbxproj +++ b/FRLayeredNavigationController.xcodeproj/project.pbxproj @@ -407,6 +407,7 @@ GCC_PREFIX_HEADER = "FRLayeredNavigationController/FRLayeredNavigationController-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; SKIP_INSTALL = YES; }; name = Debug; @@ -419,6 +420,7 @@ GCC_PREFIX_HEADER = "FRLayeredNavigationController/FRLayeredNavigationController-Prefix.pch"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; SKIP_INSTALL = YES; }; name = Release; @@ -435,6 +437,7 @@ "-all_load", ); PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; @@ -453,6 +456,7 @@ "-all_load", ); PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = YES; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; diff --git a/FRLayeredNavigationController/FRLayerController.m b/FRLayeredNavigationController/FRLayerController.m index b3183e1..246ee84 100644 --- a/FRLayeredNavigationController/FRLayerController.m +++ b/FRLayeredNavigationController/FRLayerController.m @@ -34,20 +34,22 @@ @interface FRLayerController () @property (nonatomic, strong) FRLayerChromeView *chromeView; @property (nonatomic, strong) UIView *borderView; -@property (nonatomic, strong) UIView *contentView; @end @implementation FRLayerController +#pragma mark - init/dealloc + - (id)initWithContentViewController:(UIViewController *)vc maximumWidth:(BOOL)maxWidth { if ((self = [super init])) { _layeredNavigationItem = [[FRLayeredNavigationItem alloc] init]; _layeredNavigationItem.layerController = self; _contentViewController = vc; _maximumWidth = maxWidth; + + [self attachContentViewController]; } - assert(self.parentViewController == nil); return self; } @@ -55,23 +57,11 @@ - (id)initWithContentViewController:(UIViewController *)vc maximumWidth:(BOOL)ma - (void)dealloc { self.layeredNavigationItem.layerController = nil; + [self detachContentViewController]; } -- (void)loadView { - self.view = [[UIView alloc] init]; - self.view.backgroundColor = [UIColor clearColor]; -} +#pragma mark - internal methods -- (void)willMoveToParentViewController:(UIViewController *)parent { - if (parent == nil) { - /* will be REMOVED from a container controller */ - [self.contentViewController willMoveToParentViewController:nil]; - [self.contentViewController removeFromParentViewController]; - } else { - /* will be added to a container controller */ - [self addChildViewController:self.contentViewController]; - } -} - (void)doViewLayout { CGRect contentFrame = CGRectZero; @@ -99,67 +89,59 @@ - (void)doViewLayout { } - self.contentView.frame = contentFrame; + self.contentViewController.view.frame = contentFrame; } -- (void)viewWillLayoutSubviews { - self.view.layer.shadowRadius = 10.0; - self.view.layer.shadowOffset = CGSizeMake(-2.0, -3.0); - self.view.layer.shadowOpacity = 0.5; - self.view.layer.shadowColor = [UIColor blackColor].CGColor; - self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath; +- (void)attachContentViewController +{ + [self addChildViewController:self.contentViewController]; + [self.contentViewController didMoveToParentViewController:self]; +} - [self doViewLayout]; +- (void)detachContentViewController +{ + [self.contentViewController willMoveToParentViewController:nil]; + [self.contentViewController removeFromParentViewController]; } -- (void)didMoveToParentViewController:(UIViewController *)parent { - if (parent != nil) { - assert(self.parentViewController == parent); - - const FRLayeredNavigationItem *navItem = self.layeredNavigationItem; - - self.contentView = self.contentViewController.view; - - if (self.layeredNavigationItem.hasChrome) { - self.chromeView = [[FRLayerChromeView alloc] initWithFrame:CGRectZero - titleView:navItem.titleView - title:navItem.title == nil ? - self.contentViewController.title : navItem.title]; - - self.borderView = [[UIView alloc] init]; - self.borderView.backgroundColor = [UIColor colorWithWhite:236.0f/255.0f alpha:1]; - - [self.view addSubview:self.chromeView]; - [self.view addSubview:self.borderView]; - } - [self.view addSubview:self.contentView]; - - [self doViewLayout]; - - [self.contentViewController didMoveToParentViewController:self]; - } else { - [self.contentView removeFromSuperview]; - [self.chromeView removeFromSuperview]; - [self.borderView removeFromSuperview]; +#pragma mark - UIViewController interface methods + +- (void)loadView { + self.view = [[UIView alloc] init]; + self.view.backgroundColor = [UIColor clearColor]; + + const FRLayeredNavigationItem *navItem = self.layeredNavigationItem; + + if (self.layeredNavigationItem.hasChrome) { + self.chromeView = [[FRLayerChromeView alloc] initWithFrame:CGRectZero + titleView:navItem.titleView + title:navItem.title == nil ? + self.contentViewController.title : navItem.title]; - self.contentView = nil; - self.borderView = nil; - self.chromeView = nil; + self.borderView = [[UIView alloc] init]; + self.borderView.backgroundColor = [UIColor colorWithWhite:236.0f/255.0f alpha:1]; - self.contentViewController = nil; + [self.view addSubview:self.chromeView]; + [self.view addSubview:self.borderView]; } + [self.view addSubview:self.contentViewController.view]; } -- (void)viewDidLoad -{ - [super viewDidLoad]; +- (void)viewWillLayoutSubviews { + self.view.layer.shadowRadius = 10.0; + self.view.layer.shadowOffset = CGSizeMake(-2.0, -3.0); + self.view.layer.shadowOpacity = 0.5; + self.view.layer.shadowColor = [UIColor blackColor].CGColor; + self.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.bounds].CGPath; + + [self doViewLayout]; } - (void)viewDidUnload { [super viewDidUnload]; + NSLog(@"FRLayerController (%@): viewDidUnload", self); - self.contentView = nil; self.borderView = nil; self.chromeView = nil; } @@ -172,7 +154,6 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface @synthesize contentViewController = _contentViewController; @synthesize maximumWidth = _maximumWidth; @synthesize borderView = _borderView; -@synthesize contentView = _contentView; @synthesize chromeView = _chromeView; @synthesize layeredNavigationItem = _layeredNavigationItem; diff --git a/FRLayeredNavigationController/FRLayeredNavigationController.m b/FRLayeredNavigationController/FRLayeredNavigationController.m index 5c65877..b6eb545 100644 --- a/FRLayeredNavigationController/FRLayeredNavigationController.m +++ b/FRLayeredNavigationController/FRLayeredNavigationController.m @@ -46,6 +46,7 @@ @interface FRLayeredNavigationController () @implementation FRLayeredNavigationController #pragma mark - Initialization/dealloc + - (id)initWithRootViewController:(UIViewController *)rootViewController { return [self initWithRootViewController:rootViewController configuration:^(FRLayeredNavigationItem *item) { @@ -65,6 +66,9 @@ - (id)initWithRootViewController:(UIViewController *)rootViewController layeredRC.layeredNavigationItem.hasChrome = NO; configuration(layeredRC.layeredNavigationItem); _outOfBoundsViewController = nil; + + [self addChildViewController:layeredRC]; + [layeredRC didMoveToParentViewController:self]; } return self; } @@ -78,16 +82,16 @@ - (void)dealloc { - (void)loadView { - NSAssert([self.viewControllers count] == 1, @"This is a bug, more than one ViewController present! Go on and implement more sophisticated view loading/unloading..."); - UIViewController *rootViewController = [self.viewControllers objectAtIndex:0]; - [self addChildViewController:rootViewController]; - self.view = [[UIView alloc] init]; - CGRect rootViewFrame = CGRectMake(0, 0, rootViewController.layeredNavigationItem.width, self.view.bounds.size.height); - rootViewController.view.frame = rootViewFrame; - rootViewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight; - [self.view addSubview:rootViewController.view]; - [rootViewController didMoveToParentViewController:self]; + + for (FRLayerController *vc in self.viewControllers) { + vc.view.frame = CGRectMake(vc.layeredNavigationItem.currentViewPosition.x, + vc.layeredNavigationItem.currentViewPosition.y, + vc.layeredNavigationItem.width, + self.view.frame.size.height); + vc.view.autoresizingMask = UIViewAutoresizingFlexibleHeight; + [self.view addSubview:vc.view]; + } } - (void)viewDidLoad @@ -98,6 +102,7 @@ - (void)viewDidLoad self.panGR.maximumNumberOfTouches = 1; self.panGR.delegate = self; [self.view addGestureRecognizer:self.panGR]; + self.view.backgroundColor = [UIColor clearColor]; } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)orientation @@ -121,12 +126,15 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)orientation - (void)viewWillUnload { - NSAssert([self.viewControllers count] == 1, @"This is a bug, more than one ViewController present! Go on and implement more sophisticated view loading/unloading..."); + self.panGR = nil; + self.firstTouchedView = nil; + self.outOfBoundsViewController = nil; } - (void)viewDidUnload { [super viewDidUnload]; + NSLog(@"FRLayeredNavigationController (%@): viewDidUnload", self); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation