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]不起作用。