【问题标题】:Zoom UICollectionView via pinch gesture通过捏合手势缩放 UICollectionView
【发布时间】: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 你能告诉我一些代码或示例项目吗?

标签: ios objective-c uicollectionview cgaffinetransform cgaffinetransformscale


【解决方案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];
  }
  }

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多