Skip to content

Commit

Permalink
Merge pull request #14 from mutualmobile/center_interaction_refactor
Browse files Browse the repository at this point in the history
Center Interaction Mode can become out of date if the center view controller is manipulated while the drawer is open.
  • Loading branch information
kcharwood committed May 15, 2013
2 parents 00195a2 + e0c6c94 commit eb70914
Showing 1 changed file with 43 additions and 34 deletions.
77 changes: 43 additions & 34 deletions MMDrawerController/MMDrawerController.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,51 @@
return animation;
}

@interface MMDrawerCenterContainerView : UIView
@property (nonatomic,assign) MMDrawerOpenCenterInteractionMode centerInteractionMode;
@property (nonatomic,assign) MMDrawerSide openSide;
@end

@implementation MMDrawerCenterContainerView

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *hitView = [super hitTest:point withEvent:event];
if(hitView &&
self.openSide != MMDrawerSideNone){
UINavigationBar * navBar = [self navigationBarContainedWithinSubviewsOfView:self];
CGRect navBarFrame = [navBar convertRect:navBar.frame toView:self];
if((self.centerInteractionMode == MMDrawerOpenCenterInteractionModeNavigationBarOnly &&
CGRectContainsPoint(navBarFrame, point) == NO) ||
self.centerInteractionMode == MMDrawerOpenCenterInteractionModeNone){
hitView = nil;
}
}
return hitView;
}

-(UINavigationBar*)navigationBarContainedWithinSubviewsOfView:(UIView*)view{
UINavigationBar * navBar = nil;
for(UIView * subview in [view subviews]){
if([view isKindOfClass:[UINavigationBar class]]){
navBar = (UINavigationBar*)view;
break;
}
else {
navBar = [self navigationBarContainedWithinSubviewsOfView:subview];
}
}
return navBar;
}
@end

@interface MMDrawerController () <UIGestureRecognizerDelegate>{
CGFloat _maximumRightDrawerWidth;
CGFloat _maximumLeftDrawerWidth;
}

@property (nonatomic, assign, readwrite) MMDrawerSide openSide;

@property (nonatomic, strong) UIView * centerContainerView;
@property (nonatomic, strong) MMDrawerCenterContainerView * centerContainerView;

@property (nonatomic, assign) CGRect startingPanRect;
@property (nonatomic, copy) MMDrawerControllerDrawerVisualStateBlock drawerVisualState;
Expand Down Expand Up @@ -244,9 +281,11 @@ -(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated completio
#pragma mark - Updating the Center View Controller
-(void)setCenterViewController:(UIViewController *)centerViewController animated:(BOOL)animated{
if(_centerContainerView == nil){
_centerContainerView = [[UIView alloc] initWithFrame:self.view.bounds];
_centerContainerView = [[MMDrawerCenterContainerView alloc] initWithFrame:self.view.bounds];
[self.centerContainerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
[self.centerContainerView setBackgroundColor:[UIColor clearColor]];
[self.centerContainerView setOpenSide:self.openSide];
[self.centerContainerView setCenterInteractionMode:self.centerHiddenInteractionMode];
[self.view addSubview:self.centerContainerView];
}

Expand Down Expand Up @@ -907,38 +946,8 @@ -(void)updateShadowForCenterView{
}

-(void)updateCenterViewUserInteractionState{
UINavigationBar * navBar = nil;
UIView * centerContentView = nil;
if([self.centerViewController isKindOfClass:[UINavigationController class]]){
navBar = [(UINavigationController*)self.centerViewController navigationBar];
centerContentView = [[(UINavigationController*)self.centerViewController topViewController] view];
}
else {
centerContentView = self.centerViewController.view;
}

if(self.openSide != MMDrawerSideNone){
switch (self.centerHiddenInteractionMode) {
case MMDrawerOpenCenterInteractionModeNone:
[navBar setUserInteractionEnabled:NO];
[centerContentView setUserInteractionEnabled:NO];
break;
case MMDrawerOpenCenterInteractionModeNavigationBarOnly:
[navBar setUserInteractionEnabled:YES];
[centerContentView setUserInteractionEnabled:NO];
break;

case MMDrawerOpenCenterInteractionModeFull:
[navBar setUserInteractionEnabled:YES];
[centerContentView setUserInteractionEnabled:YES];
default:
break;
}
}
else {
[navBar setUserInteractionEnabled:YES];
[centerContentView setUserInteractionEnabled:YES];
}
[self.centerContainerView setOpenSide:self.openSide];
[self.centerContainerView setCenterInteractionMode:self.centerHiddenInteractionMode];
}

-(NSTimeInterval)animationDurationForAnimationDistance:(CGFloat)distance{
Expand Down

0 comments on commit eb70914

Please sign in to comment.