From 4a7d644547cb783c39315bb12761092f23493067 Mon Sep 17 00:00:00 2001 From: BJ Homer Date: Sat, 20 Nov 2010 17:18:27 -0700 Subject: [PATCH] Shift other images on the fly while we're dragging. --- Classes/HSSidebarView.m | 53 +++++++++++++++++++++++++-------- Classes/HSSidebarViewDelegate.h | 1 + Classes/SidebarViewController.m | 4 +++ 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Classes/HSSidebarView.m b/Classes/HSSidebarView.m index d7b2ce7..6a42e11 100644 --- a/Classes/HSSidebarView.m +++ b/Classes/HSSidebarView.m @@ -17,7 +17,10 @@ @interface HSSidebarView () @property (retain) NSMutableArray *imageViews; @property (assign) BOOL initialized; + @property (retain) UIView *viewBeingDragged; +@property (assign) NSInteger draggedViewOldIndex; +@property (assign) CGFloat dragOffsetY; // readwrite overrides of public readonly methods @property (readwrite) NSUInteger imageCount; @@ -36,6 +39,8 @@ @implementation HSSidebarView @synthesize selectionGradient; @synthesize initialized; @synthesize viewBeingDragged; +@synthesize draggedViewOldIndex; +@synthesize dragOffsetY; @synthesize selectedIndex; @synthesize imageCount; @synthesize delegate; @@ -109,13 +114,17 @@ - (void)layoutSubviews { self.initialized = YES; } else { - [UIView animateWithDuration:0.1 - animations: - ^{ - [imageViews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { - view.center = [self imageViewCenterInScrollViewForIndex:idx]; - }]; - }]; + [UIView animateWithDuration:0.2 + delay:0 + options:UIViewAnimationOptionAllowUserInteraction + animations:^{ + [imageViews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) { + if (view != self.viewBeingDragged) { + view.center = [self imageViewCenterInScrollViewForIndex:idx]; + } + }]; + } + completion:NULL]; } // Draw selection layer @@ -172,25 +181,45 @@ - (void)pressedSidebar:(UILongPressGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateBegan) { self.selectedIndex = -1; - hitView.alpha = 0.5; + [UIView animateWithDuration:0.1 + animations:^{ + hitView.alpha = 0.5; + hitView.transform = CGAffineTransformMakeScale(1.1, 1.1); + } + ]; self.viewBeingDragged = hitView; + self.draggedViewOldIndex = currentIndex; + self.dragOffsetY = hitY - [self imageViewCenterInScrollViewForIndex:currentIndex].y; [_scrollView bringSubviewToFront:viewBeingDragged]; } else if (recognizer.state == UIGestureRecognizerStateChanged) { CGPoint newPosition = [recognizer locationInView:_scrollView]; - viewBeingDragged.center = CGPointMake(viewBeingDragged.center.x, newPosition.y); + viewBeingDragged.center = CGPointMake(viewBeingDragged.center.x, newPosition.y - self.dragOffsetY); + [imageViews removeObject:viewBeingDragged]; + [imageViews insertObject:viewBeingDragged atIndex:currentIndex]; + [self setNeedsLayout]; } else { CGPoint finalPosition = [self imageViewCenterInScrollViewForIndex:currentIndex]; - [UIView animateWithDuration:0.1 + [UIView animateWithDuration:0.2 animations:^{ viewBeingDragged.center = finalPosition; viewBeingDragged.alpha = 1.0; + viewBeingDragged.transform = CGAffineTransformIdentity; + } + completion:^(BOOL finished){ + self.selectedIndex = currentIndex; + [self setNeedsLayout]; }]; [imageViews removeObject:viewBeingDragged]; [imageViews insertObject:viewBeingDragged atIndex:currentIndex]; - self.selectedIndex = currentIndex; - [self setNeedsLayout]; + + if ([delegate respondsToSelector:@selector(sidebar:didMoveImageAtIndex:toIndex:)]) { + [delegate sidebar:self didMoveImageAtIndex:self.draggedViewOldIndex toIndex:currentIndex]; + } + + self.draggedViewOldIndex = -1; + self.dragOffsetY = 0; self.viewBeingDragged = nil; } } diff --git a/Classes/HSSidebarViewDelegate.h b/Classes/HSSidebarViewDelegate.h index 6811d4d..d04b3bc 100644 --- a/Classes/HSSidebarViewDelegate.h +++ b/Classes/HSSidebarViewDelegate.h @@ -15,6 +15,7 @@ #pragma mark Delegate methods @optional - (void)sidebar:(HSSidebarView *)sidebar didTapImageAtIndex:(NSUInteger)anIndex; +- (void)sidebar:(HSSidebarView *)sidebar didMoveImageAtIndex:(NSUInteger)oldIndex toIndex:(NSUInteger)newIndex; #pragma mark - #pragma mark Data source methods diff --git a/Classes/SidebarViewController.m b/Classes/SidebarViewController.m index 3fbb611..51c5088 100644 --- a/Classes/SidebarViewController.m +++ b/Classes/SidebarViewController.m @@ -69,6 +69,10 @@ -(void)sidebar:(HSSidebarView *)sidebar didTapImageAtIndex:(NSUInteger)anIndex { NSLog(@"Touched selected image at index: %u", anIndex); } +- (void)sidebar:(HSSidebarView *)sidebar didMoveImageAtIndex:(NSUInteger)oldIndex toIndex:(NSUInteger)newIndex { + NSLog(@"Image at index %d moved to index %d", oldIndex, newIndex); +} + - (void)dealloc { [_sidebar release]; [super dealloc];