CALayer dentro de UICollectionViewCell pellizco

Agregué un GIF para describir un problema. Tengo una UICollectionView con muchas celdas y cada celda tiene un CALayer dentro. Tengo un gesto de pinch en mi UICollectionView . Cuando hace zoom, parece que cada celda se aleja. Vea espacios entre celdas en gif. ¿Es posible acercar cada celda juntas? Gracias de antemano Código:

Subclass celular

 @property (nonatomic, strong) CALayer *circularLayer; - (void)layoutSubviews { [self updateRoundedCorners]; } - (void)updateRoundedCorners { CGRect bounds = self.bounds; self.circularLayer.bounds = bounds; self.circularLayer.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); } #pragma mark - Property Set - (void)setCellObject:(VenueLayoutCellObject *)cellObject { self->_cellObject = cellObject; self.objectBackgroundColor = cellObject.objectColor; self.type = cellObject.type; } 

Controlador

 - (void)didReceivePinchGesture:(UIPinchGestureRecognizer *)gesture { static CGFloat scaleStart; if (gesture.state == UIGestureRecognizerStateBegan) { scaleStart = self.venueLayoutZoom; } else if (gesture.state == UIGestureRecognizerStateChanged) { self.venueLayoutZoom = scaleStart * gesture.scale; [self.activeCollectionView.collectionViewLayout invalidateLayout]; } } 

Actualizado:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { VenueLayoutCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kVenueLayoutCellReuseIdentifier forIndexPath:indexPath]; self.activeCollectionViewCellsDictionary[indexPath] = cell; if (self.activeCollectionViewObjects.count > indexPath.section) { NSArray *rows = self.activeCollectionViewObjects[indexPath.section]; if (rows.count > indexPath.row) { if ([rows[indexPath.row] isKindOfClass:[VenueLayoutCellObject class]]) { VenueLayoutCellObject *object = rows[indexPath.row]; cell.cellObject = object; } } } return cell; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(nonnull NSIndexPath *)indexPath { CGFloat widthAndHeight = [self widthAndHeightForActiveCollectionViewItem]; return CGSizeMake(widthAndHeight *self.venueLayoutZoom, widthAndHeight * self.venueLayoutZoom); } - (CGFloat)widthAndHeightForActiveCollectionViewItem { NSArray *array = self.activeCollectionViewObjects; __block NSInteger maxCount = 0; [array enumerateObjectsUsingBlock:^(NSArray *subArray, NSUInteger idx, BOOL * _Nonnull stop) { if (subArray.count > maxCount) { maxCount = subArray.count; } }]; CGFloat widthAndHeight = CGRectGetWidth(self.activeCollectionView.bounds) / maxCount; return widthAndHeight; } 

Los cambios que está realizando en la capa están animados implícitamente , lo que significa que se realizan con una animation, aunque no se los haya indicado específicamente.

Dado que está respondiendo a los gestos de los usuarios, no desea que los cambios se animen, ya que esto los hace rezagarse detrás del gesto.

Puede desactivar animaciones implícitas durante layoutSubviews como este:

 - (void)layoutSubviews { [super layoutSubviews]; [CATransaction begin]; [CATransaction setDisableActions: YES]; [self updateRoundedCorners]; [CATransaction commit]; } 

Subclass celular

 @property (nonatomic, strong) CALayer *circularLayer; - (void)layoutSubviews { [super layoutSubviews]; [self updateRoundedCorners]; } 

El único problema que veo con este código es importante que falte [super layoutSubviews]; Si no funciona, proporcione más código.