Last active
December 7, 2016 04:30
-
-
Save cjazz/eee82b4af5a99bfb15a376a5491e6ed8 to your computer and use it in GitHub Desktop.
Cool long press gesture using CGAffineTransformMakeScale simulate moving tv cells up or down in a UITableView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma mark - Long press to move cells up and down | |
- (IBAction)longPressGestureRecognized:(id)sender { | |
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender; | |
UIGestureRecognizerState state = longPress.state; | |
CGPoint location = [longPress locationInView:self.tableView]; | |
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location]; | |
static UIView *snapshot = nil; ///< A snapshot of the row user is moving. | |
static NSIndexPath *sourceIndexPath = nil; ///< Initial index path, where gesture begins. | |
switch (state) { | |
case UIGestureRecognizerStateBegan: { | |
if (indexPath) { | |
sourceIndexPath = indexPath; | |
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; | |
// Take a snapshot of the selected row using helper method. | |
snapshot = [self customSnapshoFromView:cell]; | |
// Add the snapshot as subview, centered at cell's center... | |
__block CGPoint center = cell.center; | |
snapshot.center = center; | |
snapshot.alpha = 0.0; | |
[self.tableView addSubview:snapshot]; | |
[UIView animateWithDuration:0.25 animations:^{ | |
// Offset for gesture location. | |
center.y = location.y; | |
snapshot.center = center; | |
snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05); | |
snapshot.alpha = 0.98; | |
cell.alpha = 0.0; | |
cell.hidden = YES; | |
}]; | |
} | |
break; | |
} | |
case UIGestureRecognizerStateChanged: { | |
CGPoint center = snapshot.center; | |
center.y = location.y; | |
snapshot.center = center; | |
// Is destination valid and is it different from source? | |
if (indexPath && ![indexPath isEqual:sourceIndexPath]) { | |
// ... update data source. | |
[self.wishListData exchangeObjectAtIndex:indexPath.row withObjectAtIndex:sourceIndexPath.row]; | |
// ... move the rows. | |
[self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:indexPath]; | |
// ... and update source so it is in sync with UI changes. | |
sourceIndexPath = indexPath; | |
// save the new order of the list | |
NSMutableArray *myList = self.wishListData; | |
int i = 0; | |
for (NSManagedObject *mo in myList) | |
{ | |
[mo setValue:[NSNumber numberWithInt:i++] forKey:@"displayOrder"]; | |
} | |
[managedObjectContext save:nil]; | |
[[CoreDataController sharedInstance] saveMasterContext]; | |
} | |
break; | |
} | |
default: { | |
// Clean up. | |
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:sourceIndexPath]; | |
cell.alpha = 0.0; | |
[UIView animateWithDuration:0.25 animations:^{ | |
snapshot.center = cell.center; | |
snapshot.transform = CGAffineTransformIdentity; | |
snapshot.alpha = 0.0; | |
cell.alpha = 1.0; | |
} completion:^(BOOL finished) { | |
cell.hidden = NO; | |
sourceIndexPath = nil; | |
[snapshot removeFromSuperview]; | |
snapshot = nil; | |
}]; | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment