放大整个UICollectionView(zoom entire UICollectionView)

2019-09-02 02:22发布

我有一个iPad应用程序,其中我使用的是UICollectionView每个UICollectionViewCell包含只是一个单一的UIImage。 目前我每页9个UIImages(3行×3列)显示,我有好几页。

我想用缩放手势来放大对整个UICollectionView增大/减小行数/每页显示的列和最好的将是捏合手势期间拥有美丽的缩放动画!

目前,我已在UICollectionView加入捏合手势。 我赶上缩放手势事件中使用的比例因子来计算行/列数,如果它已经改变,那么我更新使用完整UICollectionView:

[_theCollectionView performBatchUpdates:^{
     [_theCollectionView deleteSections:[NSIndexSet indexSetWithIndex:0]];
     [_theCollectionView insertSections:[NSIndexSet indexSetWithIndex:0]];
 } completion:nil];

它的工作原理,但我在过渡期间没有流畅的动画效果。

任何的想法? UICollectionView从UIScrollView的继承,是否有重复使用的UIScrollView捏合手势功能来达到我的目标的可能性?

Answer 1:

我假设你使用的是默认UICollectionViewDelegateFlowLayout,对不对? 然后确保你相应的应对委托方法,当缩放手势时,只需验证布局。

例如,如果我想调整每一个项目的大小,而捏:

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@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是作秀,你可以应用此相同的概念,任何其他属性,这并不需要beginUpdates / endUpdates因为用户自己是承载规模的时机。

这里是正在运行的项目 ,如果你想看到它在行动。



Answer 2:

对不起,我的2美分的问题,我已经找到了解决办法,很简单。

在我PinchGesture回调刚才我做了以下内容:

void (^animateChangeWidth)() = ^() {
    _theFlowLayout.itemSize = cellSize;
};

[UIView transitionWithView:self.theCollectionView 
                  duration:0.1f 
                   options:UIViewAnimationOptionCurveLinear 
                animations:animateChangeWidth 
                completion:nil];

我的所有的细胞UICollectionView成功改变,有一个很好transition



文章来源: zoom entire UICollectionView