通过捏合手势缩放 UICollectionView

Posted

技术标签:

【中文标题】通过捏合手势缩放 UICollectionView【英文标题】:Zoom UICollectionView via pinch gesture 【发布时间】:2017-08-29 16:27:52 【问题描述】:

我有一个UICollectionView,里面有很多单元格(大约 5k+)。我想捏一下放大/缩小。我每次都尝试invalidateLayout。它真的很慢。所以我想使用CGAffineTransformMakeScale,但我不知道如何在此之后滚动。 我的代码是:

- (void)didReceivePinchGesture:(UIPinchGestureRecognizer *)gesture 
static CGFloat scaleStart;

if (gesture.state == UIGestureRecognizerStateBegan) 
    scaleStart = self.venueLayoutZoom;

else if (gesture.state == UIGestureRecognizerStateChanged) 
    CGAffineTransform transform = CGAffineTransformMakeScale(self.venueLayoutZoom, self.venueLayoutZoom);
    self.activeCollectionNode.view.transform = transform;
    self.activeCollectionNode.view.contentSize = CGSizeMake(318 * self.venueLayoutZoom, 500 * self.venueLayoutZoom);


但是当放大时我不能左右滚动。帮帮我。

【问题讨论】:

@ReinierMelian 感谢您的回复,我已经尝试过了。没用 你能把你的collectionView放在UIScrollView里面,让它不可滚动吗? @ReinierMelian 你是什么意思? 我已经完成了这项工作,但是使用了外部 UIScrollView 并调整了对俯仰手势动作的内部 tableView 约束,我在问该解决方案是否适用于您的场景 @ReinierMelian 你能告诉我一些代码或示例项目吗? 【参考方案1】:

使用

@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];
  
  

【讨论】:

以上是关于通过捏合手势缩放 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Android 测试生成缩放/捏合手势

在 iOS 10 上的 WKWebView 中打开 PDF 文件时启用捏合缩放手势

捏合和点击手势无法正常工作

UIImageView 上的捏合、平移和双击手势

使用 Unity 5 UI 进行捏合缩放

同时检测捏合和旋转手势