gpt4 book ai didi

ios - UICollectionView 单元格的水平重新排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:30:57 26 4
gpt4 key购买 nike

我有一个水平滚动的 UICollectionView。每个单元格对应数组中的一个对象(货币代码)。我想要的是能够通过拖放手势对单元格重新排序。

我找到了一个 tutorial对于 UITableView 并尝试过,但是当我按住并拖动一个单元格时,它只会垂直移动,当我将手指移到屏幕边缘时它不会滚动。这是一个gif .

我想要发生的是让单元格水平移动,而不是垂直移动,并让 Collection View 在到达屏幕边缘时滚动。我将如何实现这一目标?

这是我现在拥有的:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(longPressGestureRecognised:)];
[self.collectionView addGestureRecognizer: longPress];


-(IBAction) longPressGestureRecognised:(id)sender
{
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;
UIGestureRecognizerState state = longPress.state;

CGPoint location = [longPress locationInView: self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint: location];

static UIView *snapshot = nil;
static NSIndexPath *sourceIndexPath = nil;

switch (state) {
case UIGestureRecognizerStateBegan: {
if (indexPath) {
sourceIndexPath = indexPath;

UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath: indexPath];

// Take a snapshot of the selected item using helper method.
snapshot = [self customSnapshotFromView: cell];

// Add the snapshot as subview, centered at cell's centre.
__block CGPoint centre = cell.center;
snapshot.center = centre;
snapshot.alpha = 0.0;
[self.collectionView addSubview: snapshot];
[UIView animateWithDuration: 0.25 animations:^{

// Offset for gesture location.
centre.y = location.y;
snapshot.center = centre;
snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05);
snapshot.alpha = 0.98;

// Fade out.
cell.alpha = 0.0;

} completion: ^(BOOL finished) {
cell.hidden = YES;
}];
}
break;
}

case UIGestureRecognizerStateChanged: {
CGPoint centre = snapshot.center;
centre.y = location.y;
snapshot.center = centre;

// Is destination valid and is it different from source?
if (indexPath && ![indexPath isEqual: sourceIndexPath]) {
// Update data source.
[currencyArray exchangeObjectAtIndex: indexPath.item withObjectAtIndex:sourceIndexPath.item];

// Move the items.
[self.collectionView moveItemAtIndexPath: sourceIndexPath toIndexPath: indexPath];

// And update source so it is in sync with UI changes.
sourceIndexPath = indexPath;
}
break;
}

default: {
// Clean up.
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath: sourceIndexPath];
cell.hidden = NO;
cell.alpha = 0.0;
[UIView animateWithDuration: 0.25 animations: ^{

snapshot.center = cell.center;
snapshot.transform = CGAffineTransformIdentity;
snapshot.alpha = 0.0;

// Undo fade out.
cell.alpha = 1.0;

}completion: ^(BOOL finished) {

sourceIndexPath = nil;
[snapshot removeFromSuperview];
snapshot = nil;

}];
break;
}
}
}


-(UIView *) customSnapshotFromView:(UIView *)inputView
{
// Make an image from the input view.
UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, NO, 0);
[inputView.layer renderInContext: UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Create an image view.
UIView *snapshot = [[UIImageView alloc] initWithImage: image];
snapshot.layer.masksToBounds = NO;
snapshot.layer.cornerRadius = 0.0;
snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0);
snapshot.layer.shadowRadius = 5.0;
snapshot.layer.shadowOpacity = 0.4;

return snapshot;
}

编辑:我想通了。这是代码:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(handleLongGesture:)];
[self.collectionView addGestureRecognizer: longPress];

-(IBAction) handleLongGesture: (id)sender {
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;

CGPoint location = [longPress locationInView: self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint: location];

switch (longPress.state) {
case UIGestureRecognizerStateBegan:
[self.collectionView beginInteractiveMovementForItemAtIndexPath: indexPath];
NSLog(@"Gesture began");
break;

case UIGestureRecognizerStateChanged:
[self.collectionView updateInteractiveMovementTargetPosition: [longPress locationInView: longPress.view]];
NSLog(@"Gesture state changed");
break;

case UIGestureRecognizerStateEnded:
[self.collectionView endInteractiveMovement];
NSLog(@"Gesture state ended");
break;

default:
[self.collectionView cancelInteractiveMovement];
NSLog(@"Gesture cancelled");
break;
}
}

最佳答案

在 UIGestureRecognizerStateChanged 中:更改这行代码

        CGPoint centre = snapshot.center;
centre.x = location.x;
snapshot.center = centre;

centre.y 返回 y 轴拖动

将其更改为center.x用于x轴拖动

关于ios - UICollectionView 单元格的水平重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37437614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com