From b1ae5e6043e444316b5224aacb11a465cf27728b Mon Sep 17 00:00:00 2001 From: Feather Date: Thu, 18 Apr 2013 13:49:15 +0800 Subject: [PATCH] using gesture to drag --- .../project.pbxproj | 24 --- .../UserInterfaceState.xcuserstate | Bin 25249 -> 27812 bytes .../xcdebugger/Breakpoints.xcbkptlist | 15 ++ MultiLayerNavigation/ViewController.h | 1 - MultiLayerNavigation/ViewController.m | 21 ++- Src/MLNavigationController.m | 155 ++++++++---------- 6 files changed, 89 insertions(+), 127 deletions(-) diff --git a/MultiLayerNavigation.xcodeproj/project.pbxproj b/MultiLayerNavigation.xcodeproj/project.pbxproj index 11d7dfd..88933ca 100644 --- a/MultiLayerNavigation.xcodeproj/project.pbxproj +++ b/MultiLayerNavigation.xcodeproj/project.pbxproj @@ -17,11 +17,8 @@ 67C603131717C6A500629C0E /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 67C603121717C6A500629C0E /* Default@2x.png */; }; 67C603151717C6A500629C0E /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 67C603141717C6A500629C0E /* Default-568h@2x.png */; }; 67C603181717C6A500629C0E /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 67C603171717C6A500629C0E /* ViewController.m */; }; - 67C6031B1717C6A500629C0E /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 67C603191717C6A500629C0E /* ViewController.xib */; }; 67C603251717DE5A00629C0E /* leftside_shadow_bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 67C603241717DE5A00629C0E /* leftside_shadow_bg@2x.png */; }; - 67D2EA04171E415800071E64 /* MLTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 67D2EA03171E415800071E64 /* MLTableView.m */; }; 67F1E622171D11C800A8CE9F /* MLNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F1E61F171D11C800A8CE9F /* MLNavigationController.m */; }; - 67F1E623171D11C800A8CE9F /* MLScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 67F1E621171D11C800A8CE9F /* MLScrollView.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -40,14 +37,9 @@ 67C603141717C6A500629C0E /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 67C603161717C6A500629C0E /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 67C603171717C6A500629C0E /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 67C6031A1717C6A500629C0E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController.xib; sourceTree = ""; }; 67C603241717DE5A00629C0E /* leftside_shadow_bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "leftside_shadow_bg@2x.png"; sourceTree = ""; }; - 67D2EA02171E415800071E64 /* MLTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLTableView.h; sourceTree = ""; }; - 67D2EA03171E415800071E64 /* MLTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLTableView.m; sourceTree = ""; }; 67F1E61E171D11C800A8CE9F /* MLNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLNavigationController.h; sourceTree = ""; }; 67F1E61F171D11C800A8CE9F /* MLNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLNavigationController.m; sourceTree = ""; }; - 67F1E620171D11C800A8CE9F /* MLScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLScrollView.h; sourceTree = ""; }; - 67F1E621171D11C800A8CE9F /* MLScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLScrollView.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,7 +91,6 @@ 67C6030E1717C6A500629C0E /* AppDelegate.m */, 67C603161717C6A500629C0E /* ViewController.h */, 67C603171717C6A500629C0E /* ViewController.m */, - 67C603191717C6A500629C0E /* ViewController.xib */, 67C603051717C6A500629C0E /* Supporting Files */, ); path = MultiLayerNavigation; @@ -125,10 +116,6 @@ children = ( 67F1E61E171D11C800A8CE9F /* MLNavigationController.h */, 67F1E61F171D11C800A8CE9F /* MLNavigationController.m */, - 67F1E620171D11C800A8CE9F /* MLScrollView.h */, - 67F1E621171D11C800A8CE9F /* MLScrollView.m */, - 67D2EA02171E415800071E64 /* MLTableView.h */, - 67D2EA03171E415800071E64 /* MLTableView.m */, ); path = Src; sourceTree = SOURCE_ROOT; @@ -188,7 +175,6 @@ 67C603111717C6A500629C0E /* Default.png in Resources */, 67C603131717C6A500629C0E /* Default@2x.png in Resources */, 67C603151717C6A500629C0E /* Default-568h@2x.png in Resources */, - 67C6031B1717C6A500629C0E /* ViewController.xib in Resources */, 67C603251717DE5A00629C0E /* leftside_shadow_bg@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -204,8 +190,6 @@ 67C6030F1717C6A500629C0E /* AppDelegate.m in Sources */, 67C603181717C6A500629C0E /* ViewController.m in Sources */, 67F1E622171D11C800A8CE9F /* MLNavigationController.m in Sources */, - 67F1E623171D11C800A8CE9F /* MLScrollView.m in Sources */, - 67D2EA04171E415800071E64 /* MLTableView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -220,14 +204,6 @@ name = InfoPlist.strings; sourceTree = ""; }; - 67C603191717C6A500629C0E /* ViewController.xib */ = { - isa = PBXVariantGroup; - children = ( - 67C6031A1717C6A500629C0E /* en */, - ); - name = ViewController.xib; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/MultiLayerNavigation.xcodeproj/project.xcworkspace/xcuserdata/chanfeather.xcuserdatad/UserInterfaceState.xcuserstate b/MultiLayerNavigation.xcodeproj/project.xcworkspace/xcuserdata/chanfeather.xcuserdatad/UserInterfaceState.xcuserstate index befc22e470c9918dedb4c824b696bc8931618dce..dc22a173e916150898fc1bc4ceca2282f225fd67 100644 GIT binary patch literal 27812 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≀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 U9f1%;QPNLYp!C!E@0j%e1Gf)&5&!@I literal 25249 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 + + + + -#import "MLTableView.h" @interface ViewController : UIViewController diff --git a/MultiLayerNavigation/ViewController.m b/MultiLayerNavigation/ViewController.m index 7521bdc..ded13b2 100644 --- a/MultiLayerNavigation/ViewController.m +++ b/MultiLayerNavigation/ViewController.m @@ -8,7 +8,6 @@ #import "ViewController.h" #import "MLNavigationController.h" -#import "MLScrollView.h" @interface ViewController () @@ -39,20 +38,20 @@ UILabel *textView = [[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 180)]autorelease]; textView.font = [UIFont systemFontOfSize:12]; - textView.text = @"MultiLayerNavigation helps you implemntation the interaction -- 'drag to back' in a easy way.\n The only one thing you need to do is replacing your UINavigationController with the MLNavigation Controller or inherit it. \n In addtion, if there are a scroll view in your ViewController, you need to do one more thing -- replace the UIScrollView with MLScrollView or inherit it, that's all."; + textView.text = @"MultiLayerNavigation helps you implemntation the interaction -- 'drag to back' in a easy way.\n The only one thing you need to do is replacing your UINavigationController with the MLNavigation Controller or inherit it."; textView.numberOfLines = 0; -// MLScrollView *scrollView = [[[MLScrollView alloc]initWithFrame:CGRectMake(0,300,320,140)]autorelease]; -// scrollView.contentSize = CGSizeMake(320, 200); -// scrollView.userInteractionEnabled = YES; -// [scrollView addSubview:textView]; -// [self.view addSubview:scrollView]; + UIScrollView *scrollView = [[[UIScrollView alloc]initWithFrame:CGRectMake(0,300,320,140)]autorelease]; + scrollView.contentSize = CGSizeMake(320, 200); + scrollView.userInteractionEnabled = YES; + [scrollView addSubview:textView]; + [self.view addSubview:scrollView]; - MLTableView *tableView = [[[MLTableView alloc]initWithFrame:CGRectMake(0, 300, 320, 140)]autorelease]; - tableView.delegate = self; - tableView.dataSource = self; - [self.view addSubview:tableView]; +// UITableView *tableView = [[[UITableView alloc]initWithFrame:CGRectMake(0, 300, 320, 140)]autorelease]; +// tableView.delegate = self; +// tableView.dataSource = self; +// [self.view addSubview:tableView]; } diff --git a/Src/MLNavigationController.m b/Src/MLNavigationController.m index 5fa8c6f..4707e50 100644 --- a/Src/MLNavigationController.m +++ b/Src/MLNavigationController.m @@ -68,7 +68,10 @@ shadowImageView.frame = CGRectMake(-10, 0, 10, self.view.frame.size.height); [self.view addSubview:shadowImageView]; - + UIPanGestureRecognizer *recognizer = [[[UIPanGestureRecognizer alloc]initWithTarget:self + action:@selector(paningGestureReceive:)]autorelease]; + [recognizer delaysTouchesBegan]; + [self.view addGestureRecognizer:recognizer]; } - (void)didReceiveMemoryWarning @@ -108,7 +111,7 @@ - (void)moveViewWithX:(float)x { - + NSLog(@"Move to:%f",x); x = x>320?320:x; x = x<0?0:x; @@ -124,108 +127,78 @@ } -#pragma mark - UIResponse Subclassing Methods - +#pragma mark - Gesture Recognizer - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +- (void)paningGestureReceive:(UIPanGestureRecognizer *)recoginzer { -// NSLog(@"navi touch begin"); - [super touchesBegan:touches withEvent:event]; - if (self.viewControllers.count <= 1 || !self.canDragBack) return; - _isMoving = NO; - startTouch = [((UITouch *)[touches anyObject])locationInView:KEY_WINDOW]; -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event -{ - [super touchesMoved:touches withEvent:event]; + CGPoint touchPoint = [recoginzer locationInView:KEY_WINDOW]; -// NSLog(@"navi touch move:%f",[((UITouch *)[touches anyObject])locationInView:KEY_WINDOW].x); - - if (self.viewControllers.count <= 1 || !self.canDragBack) return; - - CGPoint moveTouch = [((UITouch *)[touches anyObject])locationInView:KEY_WINDOW]; - - if (!_isMoving) { - if(moveTouch.x - startTouch.x > 10) + if (recoginzer.state == UIGestureRecognizerStateBegan) { + + _isMoving = YES; + startTouch = touchPoint; + + if (!self.backgroundView) { - _isMoving = YES; - - if (!self.backgroundView) - { - CGRect frame = self.view.frame; - - self.backgroundView = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width , frame.size.height)]autorelease]; - [self.view.superview insertSubview:self.backgroundView belowSubview:self.view]; - - blackMask = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width , frame.size.height)]autorelease]; - blackMask.backgroundColor = [UIColor blackColor]; - [self.backgroundView addSubview:blackMask]; - } - - if (lastScreenShotView) [lastScreenShotView removeFromSuperview]; - - UIImage *lastScreenShot = [self.screenShotsList lastObject]; - lastScreenShotView = [[[UIImageView alloc]initWithImage:lastScreenShot]autorelease]; - [self.backgroundView insertSubview:lastScreenShotView belowSubview:blackMask]; - - } - } - - if (_isMoving) { - [self moveViewWithX:moveTouch.x - startTouch.x]; - } -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -{ -// NSLog(@"navi touch end"); - - [super touchesEnded:touches withEvent:event]; - - if (self.viewControllers.count <= 1 || !self.canDragBack) return; - - CGPoint endTouch = [((UITouch *)[touches anyObject])locationInView:KEY_WINDOW]; - - if (endTouch.x - startTouch.x > 50) - { - [UIView animateWithDuration:0.3 animations:^{ - [self moveViewWithX:320]; - } completion:^(BOOL finished) { - - [self popViewControllerAnimated:NO]; CGRect frame = self.view.frame; - frame.origin.x = 0; - self.view.frame = frame; - - _isMoving = NO; - }]; - } - else - { + + self.backgroundView = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width , frame.size.height)]autorelease]; + [self.view.superview insertSubview:self.backgroundView belowSubview:self.view]; + + blackMask = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width , frame.size.height)]autorelease]; + blackMask.backgroundColor = [UIColor blackColor]; + [self.backgroundView addSubview:blackMask]; + } + + if (lastScreenShotView) [lastScreenShotView removeFromSuperview]; + + UIImage *lastScreenShot = [self.screenShotsList lastObject]; + lastScreenShotView = [[[UIImageView alloc]initWithImage:lastScreenShot]autorelease]; + [self.backgroundView insertSubview:lastScreenShotView belowSubview:blackMask]; + + }else if (recoginzer.state == UIGestureRecognizerStateEnded){ + + if (touchPoint.x - startTouch.x > 50) + { + [UIView animateWithDuration:0.3 animations:^{ + [self moveViewWithX:320]; + } completion:^(BOOL finished) { + + [self popViewControllerAnimated:NO]; + CGRect frame = self.view.frame; + frame.origin.x = 0; + self.view.frame = frame; + + _isMoving = NO; + }]; + } + else + { + [UIView animateWithDuration:0.3 animations:^{ + [self moveViewWithX:0]; + } completion:^(BOOL finished) { + _isMoving = NO; + }]; + + } + return; + + }else if (recoginzer.state == UIGestureRecognizerStateCancelled){ + [UIView animateWithDuration:0.3 animations:^{ [self moveViewWithX:0]; } completion:^(BOOL finished) { _isMoving = NO; }]; - + + return; + } + + if (_isMoving) { + [self moveViewWithX:touchPoint.x - startTouch.x]; } } -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event -{ -// NSLog(@"navi touch cancel"); - - [super touchesCancelled:touches withEvent:event]; - - if (self.viewControllers.count <= 1 || !self.canDragBack) return; - - [UIView animateWithDuration:0.3 animations:^{ - [self moveViewWithX:0]; - } completion:^(BOOL finished) { - _isMoving = NO; - }]; -} - @end