Skip to content

Commit

Permalink
Potential fix for #71
Browse files Browse the repository at this point in the history
  • Loading branch information
kcharwood committed Aug 12, 2013
1 parent 297d7ec commit 39ffd4e
Showing 1 changed file with 98 additions and 83 deletions.
181 changes: 98 additions & 83 deletions MMDrawerController/MMDrawerController.m
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ @interface MMDrawerController () <UIGestureRecognizerDelegate>{
@property (nonatomic, copy) MMDrawerControllerDrawerVisualStateBlock drawerVisualState;
@property (nonatomic, copy) MMDrawerGestureShouldRecognizeTouchBlock gestureShouldRecognizeTouch;
@property (nonatomic, copy) MMDrawerGestureCompletionBlock gestureCompletion;
@property (nonatomic, assign) BOOL isAnimating;

@end

Expand Down Expand Up @@ -193,109 +194,123 @@ -(void)closeDrawerAnimated:(BOOL)animated completion:(void (^)(BOOL))completion{
}

-(void)closeDrawerAnimated:(BOOL)animated velocity:(CGFloat)velocity animationOptions:(UIViewAnimationOptions)options completion:(void (^)(BOOL))completion{
CGRect newFrame = self.view.bounds;

CGFloat distance = ABS(CGRectGetMinX(self.centerContainerView.frame));
NSTimeInterval duration = MAX(distance/ABS(velocity),MMDrawerMinimumAnimationDuration);

BOOL leftDrawerVisible = CGRectGetMinX(self.centerContainerView.frame) > 0;
BOOL rightDrawerVisible = CGRectGetMinX(self.centerContainerView.frame) < 0;

MMDrawerSide visibleSide = MMDrawerSideNone;
CGFloat percentVisble = 0.0;

if(leftDrawerVisible){
CGFloat visibleDrawerPoints = CGRectGetMinX(self.centerContainerView.frame);
percentVisble = MAX(0.0,visibleDrawerPoints/self.maximumLeftDrawerWidth);
visibleSide = MMDrawerSideLeft;
}
else if(rightDrawerVisible){
CGFloat visibleDrawerPoints = CGRectGetWidth(self.centerContainerView.frame)-CGRectGetMaxX(self.centerContainerView.frame);
percentVisble = MAX(0.0,visibleDrawerPoints/self.maximumRightDrawerWidth);
visibleSide = MMDrawerSideRight;
}

UIViewController * sideDrawerViewController = [self sideDrawerViewControllerForSide:visibleSide];

[self updateDrawerVisualStateForDrawerSide:visibleSide percentVisible:percentVisble];

[sideDrawerViewController beginAppearanceTransition:NO animated:animated];

[UIView
animateWithDuration:(animated?duration:0.0)
delay:0.0
options:options
animations:^{
[self.centerContainerView setFrame:newFrame];
[self updateDrawerVisualStateForDrawerSide:visibleSide percentVisible:0.0];
}
completion:^(BOOL finished) {
[sideDrawerViewController endAppearanceTransition];
[self setOpenSide:MMDrawerSideNone];
[self resetDrawerVisualStateForDrawerSide:visibleSide];

if(completion){
completion(finished);
}
}];
}

-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated completion:(void (^)(BOOL))completion{
NSParameterAssert(drawerSide != MMDrawerSideNone);

[self openDrawerSide:drawerSide animated:animated velocity:self.animationVelocity animationOptions:UIViewAnimationOptionCurveEaseInOut completion:completion];
}

-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated velocity:(CGFloat)velocity animationOptions:(UIViewAnimationOptions)options completion:(void (^)(BOOL))completion{
NSParameterAssert(drawerSide != MMDrawerSideNone);

UIViewController * sideDrawerViewController = [self sideDrawerViewControllerForSide:drawerSide];
CGRect visibleRect = CGRectIntersection(self.view.bounds,sideDrawerViewController.view.frame);
BOOL drawerFullyCovered = (CGRectContainsRect(self.centerContainerView.frame, visibleRect) ||
CGRectIsNull(visibleRect));
if(drawerFullyCovered){
[self prepareToPresentDrawer:drawerSide animated:animated];
if(self.isAnimating){
if(completion){
completion(NO);
}
}

if(sideDrawerViewController){
CGRect newFrame;
CGRect oldFrame = self.centerContainerView.frame;
if(drawerSide == MMDrawerSideLeft){
newFrame = self.centerContainerView.frame;
newFrame.origin.x = self.maximumLeftDrawerWidth;
else {
self.isAnimating = animated;
CGRect newFrame = self.view.bounds;

CGFloat distance = ABS(CGRectGetMinX(self.centerContainerView.frame));
NSTimeInterval duration = MAX(distance/ABS(velocity),MMDrawerMinimumAnimationDuration);

BOOL leftDrawerVisible = CGRectGetMinX(self.centerContainerView.frame) > 0;
BOOL rightDrawerVisible = CGRectGetMinX(self.centerContainerView.frame) < 0;

MMDrawerSide visibleSide = MMDrawerSideNone;
CGFloat percentVisble = 0.0;

if(leftDrawerVisible){
CGFloat visibleDrawerPoints = CGRectGetMinX(self.centerContainerView.frame);
percentVisble = MAX(0.0,visibleDrawerPoints/self.maximumLeftDrawerWidth);
visibleSide = MMDrawerSideLeft;
}
else {
newFrame = self.centerContainerView.frame;
newFrame.origin.x = 0-self.maximumRightDrawerWidth;
else if(rightDrawerVisible){
CGFloat visibleDrawerPoints = CGRectGetWidth(self.centerContainerView.frame)-CGRectGetMaxX(self.centerContainerView.frame);
percentVisble = MAX(0.0,visibleDrawerPoints/self.maximumRightDrawerWidth);
visibleSide = MMDrawerSideRight;
}

CGFloat distance = ABS(CGRectGetMinX(oldFrame)-newFrame.origin.x);
NSTimeInterval duration = MAX(distance/ABS(velocity),MMDrawerMinimumAnimationDuration);
UIViewController * sideDrawerViewController = [self sideDrawerViewControllerForSide:visibleSide];

[self updateDrawerVisualStateForDrawerSide:visibleSide percentVisible:percentVisble];

[sideDrawerViewController beginAppearanceTransition:NO animated:animated];

[UIView
animateWithDuration:(animated?duration:0.0)
delay:0.0
options:options
animations:^{
[self.centerContainerView setFrame:newFrame];
[self updateDrawerVisualStateForDrawerSide:drawerSide percentVisible:1.0];
[self updateDrawerVisualStateForDrawerSide:visibleSide percentVisible:0.0];
}
completion:^(BOOL finished) {
//End the appearance transition if it already wasn't open.
if(drawerSide != self.openSide){
[sideDrawerViewController endAppearanceTransition];
}
[self setOpenSide:drawerSide];

[self resetDrawerVisualStateForDrawerSide:drawerSide];

[sideDrawerViewController endAppearanceTransition];
[self setOpenSide:MMDrawerSideNone];
[self resetDrawerVisualStateForDrawerSide:visibleSide];
self.isAnimating = NO;
if(completion){
completion(finished);
}
}];
}
}

-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated completion:(void (^)(BOOL))completion{
NSParameterAssert(drawerSide != MMDrawerSideNone);

[self openDrawerSide:drawerSide animated:animated velocity:self.animationVelocity animationOptions:UIViewAnimationOptionCurveEaseInOut completion:completion];
}

-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated velocity:(CGFloat)velocity animationOptions:(UIViewAnimationOptions)options completion:(void (^)(BOOL))completion{
NSParameterAssert(drawerSide != MMDrawerSideNone);
if(self.isAnimating){
if(completion){
completion(NO);
}
}
else {
UIViewController * sideDrawerViewController = [self sideDrawerViewControllerForSide:drawerSide];
CGRect visibleRect = CGRectIntersection(self.view.bounds,sideDrawerViewController.view.frame);
BOOL drawerFullyCovered = (CGRectContainsRect(self.centerContainerView.frame, visibleRect) ||
CGRectIsNull(visibleRect));
if(drawerFullyCovered){
[self prepareToPresentDrawer:drawerSide animated:animated];
}

if(sideDrawerViewController){
CGRect newFrame;
CGRect oldFrame = self.centerContainerView.frame;
if(drawerSide == MMDrawerSideLeft){
newFrame = self.centerContainerView.frame;
newFrame.origin.x = self.maximumLeftDrawerWidth;
}
else {
newFrame = self.centerContainerView.frame;
newFrame.origin.x = 0-self.maximumRightDrawerWidth;
}

CGFloat distance = ABS(CGRectGetMinX(oldFrame)-newFrame.origin.x);
NSTimeInterval duration = MAX(distance/ABS(velocity),MMDrawerMinimumAnimationDuration);
self.isAnimating = animated;
[UIView
animateWithDuration:(animated?duration:0.0)
delay:0.0
options:options
animations:^{
[self.centerContainerView setFrame:newFrame];
[self updateDrawerVisualStateForDrawerSide:drawerSide percentVisible:1.0];
}
completion:^(BOOL finished) {
//End the appearance transition if it already wasn't open.
if(drawerSide != self.openSide){
[sideDrawerViewController endAppearanceTransition];
}
[self setOpenSide:drawerSide];

[self resetDrawerVisualStateForDrawerSide:drawerSide];
self.isAnimating = NO;
if(completion){
completion(finished);
}
}];
}
}
}

#pragma mark - Updating the Center View Controller
-(void)setCenterViewController:(UIViewController *)centerViewController animated:(BOOL)animated{
if(_centerContainerView == nil){
Expand Down

0 comments on commit 39ffd4e

Please sign in to comment.