2

我有一个集合视图与子类,UICollectionViewFlow布局。 我要做的效果是旋转(透视,绕y轴)和运动缩放。 我的收藏视图设置为分页模式ON,水平滚动,每个单元都有全屏,也就是说,它们的框架等于收集视图的边界。每个单元格都有一个表格视图。自定义UICollectionViewFlowLayout问题

问题是我越来越奇怪的行为。目前在屏幕上的单元格内的表格很好。当我平移到另一个单元格时出现问题。单元格内的表格似乎完全错误!它只填满了一半的细胞,即使细胞更大。在界面生成器中,我将表格设置为将其边缘粘贴到其超级视图(单元格)边缘(Autolayout)。

经过一段时间,我认为[cell layoutsubviews]在视图实例化后仅被调用一次。由于我在下面的代码中直接设置了UICollectionViewLayoutAttributes,所以可以在初始旋转的情况下布置表视图(由于透视旋转严重,超级视图的框架会缩小),并且由于[cell layoutsubiews]永远不会再次调用它只是保持这种方式?

第二个怪癖是布局的回调没有意义。 collectionView:didEndDisplayingCell:forItemAtIndexPath: 例如,告诉我索引路径上的视图已经停止显示,甚至在它出现在屏幕上之前!

有人可以尝试这种布局,也许告诉我我做错了什么?

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray* array = [super layoutAttributesForElementsInRect:rect]; 

    CGRect visibleRect; 
    visibleRect.origin = self.collectionView.contentOffset; 
    visibleRect.size = self.collectionView.bounds.size; 

    for (UICollectionViewLayoutAttributes* attributes in array) 
    { 
     if (CGRectIntersectsRect(visibleRect, attributes.frame) && 
      ABS(CGRectGetMidX(visibleRect) - attributes.center.x) <= self.collectionView.frame.size.width) 
     { 
      CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x; 
      CGFloat absoluteDistance = ABS(distance); 

      CGFloat angle = [self normalizeFromMin:0 
              fromMax:self.collectionView.frame.size.width 
              toMin:0 
              toMax:90 
              value:absoluteDistance]; 

      CGFloat scale = [self normalizeFromMin:0 
              fromMax:self.collectionView.frame.size.width 
              toMin:0.7 
              toMax:1 
              value:absoluteDistance]; 

      CATransform3D transform = CATransform3DIdentity; 
      transform.m34 = 1.0/-1800; 
      if(distance > 0) 
      { 
       transform = CATransform3DRotate(transform, radians(angle), 0.0, 1.0, 0.0); 
      } 
      else 
      { 
       transform = CATransform3DRotate(transform, -radians(angle), 0.0, 1.0, 0.0); 
      } 

      transform = CATransform3DScale(transform, 1.0 - scale, 1.0 - scale, 0.0); 
      attributes.transform3D = transform; 
      attributes.alpha = 1.0; 

      if(distance == 0) 
      { 
       attributes.zIndex = 1; 
       attributes.transform3D = CATransform3DIdentity; 
      } 
      else 
      { 
       attributes.zIndex = 0; 
      } 
     } 
    } 

    return array; 
} 

-(CGFloat)normalizeFromMin:(CGFloat)fromMin 
        fromMax:(CGFloat)fromMax 
        toMin:(CGFloat)toMin 
        toMax:(CGFloat)toMax 
        value:(CGFloat)toNormalize 
{ 
    CGFloat toBeDivided = toMin + (toNormalize - fromMin) * (toMax - toMin); 
    CGFloat result = toBeDivided/(fromMax - fromMin); 
    return result; 
} 

编辑:

加入

attributes.frame = attributes.frame 

似乎排序的帮助下,在宽度方面,但表内似乎不正确的布局。它看起来像大小是正确的,但在旋转时的电池只是有点夹桌子,但表本身只是看起来怪异,像有适用于它没有旋转,

回答

0

部分修复:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView 
{ 
    CGRect visibleRect; 
    visibleRect.origin = self.collectionView.contentOffset; 
    visibleRect.size = self.collectionView.bounds.size;  
    NSArray *paths = [self.collectionView indexPathsForVisibleItems]; 
    [paths enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     UICollectionViewCell *cell =b[self.collectionView cellForItemAtIndexPath:obj]; 
     [cell.contentView.subviews[0] setFrame:cell.contentView.bounds]; 
    }]; 
} 

如果我将我的控制器设置为该方法的集合视图的委托,它确实可以工作,但我希望自动布局启动并为我执行此操作。 [cell.contentView setNeedsLayout]/[cell.contentView layoutIfNeeded]不起作用。