2

У меня есть представление коллекции с подклассом, макета UICollectionViewFlow. Эффект, который я собираюсь сделать, - вращение (перспектива, круглая ось y) и масштабирование при движении. В моем представлении «Моя коллекция» включен режим подкачки, горизонтальная прокрутка, каждая ячейка имеет полный экран, т. Е. Их кадр равен границам просмотра коллекции. Каждая ячейка имеет внутренний вид таблицы.Пользовательский UICollectionViewFlowLayout issue

Проблема в том, что я получаю странное поведение. Таблица внутри ячейки, которая в настоящее время находится на экране, прекрасна. Проблема возникает, когда я переношу в другую ячейку. Стол внутри ячейки, кажется, имеет свой размер совершенно неправильно! Он просто заполняет половину ячейки, хотя ячейка намного больше. В построителе интерфейса я установил таблицу для привязки ее ребер к ее краям супервизора (ячейки) (Autolayout).

По прошествии некоторого времени я понял, что [cell layoutsubviews] вызывается только один раз после создания представления. Поскольку я устанавливаю UICollectionViewLayoutAttributes с вращением сразу в этом коде ниже, можно было бы планировать представление таблицы с учетом начального вращения (рамка супервизора сжимается в результате сильного вращения перспективы), а поскольку [layout layouts] не всегда снова называется, он просто остается таким?

Вторая странность в том, что обратные вызовы из макета не имеют смысла. 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; 
} 

EDIT:

добавления

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

Если я установил свой контроллер в качестве делегата представления коллекции для этого метода, он, похоже, сработает, но мне бы хотелось, чтобы Auto Layout начинал и делал это для меня. [cell.contentView setNeedsLayout]/[cell.contentView layoutIfNeeded] не работает.

Смежные вопросы