我有一个iPad应用程序,我正在使用UICollectionView,每个UICollectionViewCell只包含一个UIImage.目前我每页显示每9个UIImages(3行*3列),我有几页.
我想使用Pinch Gesture缩放整个UICollectionView来增加/减少每页显示的行数/列数,最好是在Pinch手势期间获得漂亮的缩放动画!
目前,我在我的UICollectionView上添加了一个Pinch Gesture.我抓住Pinch Gesture事件使用比例因子计算行数/列数,如果它已经改变,那么我使用以下方法更新完整的UICollectionView:
[_theCollectionView performBatchUpdates:^{ [_theCollectionView deleteSections:[NSIndexSet indexSetWithIndex:0]]; [_theCollectionView insertSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil];
它有效,但在过渡期间我没有平滑的动画.
任何的想法?UICollectionView继承自UIScrollView,是否有可能重用UIScrollView Pinch手势功能来实现我的目标?
我假设你正在使用默认的UICollectionViewDelegateFlowLayout,对吗?然后确保相应地响应委托方法,并且当发生夹点手势时,只需使布局无效.
例如,如果我想调整每个项目的大小,同时捏:
@interface ViewController ()@property (nonatomic,assign) CGFloat scale; @property (nonatomic,weak) IBOutlet UICollectionView *collectionView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.scale = 1.0; [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; UIPinchGestureRecognizer *gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(didReceivePinchGesture:)]; [self.collectionView addGestureRecognizer:gesture]; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake(50*self.scale, 50*self.scale); } - (void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture { static CGFloat scaleStart; if (gesture.state == UIGestureRecognizerStateBegan) { scaleStart = self.scale; } else if (gesture.state == UIGestureRecognizerStateChanged) { self.scale = scaleStart * gesture.scale; [self.collectionView.collectionViewLayout invalidateLayout]; } }
该属性self.scale
仅用于show,您可以将此相同的概念应用于任何其他属性,这不需要beginUpdates/endUpdates,因为用户自己正在承载比例的时间.
这是一个正在运行的项目,以防您希望在行动中看到它.