2013-07-17 3 views
0

Когда я реализую UICollectionView без специального объекта макета, появляются все 16 из моих повторно используемых ячеек. То есть, у меня есть 1 раздел с 16 элементами в этом разделе. Когда я создаю собственный объект макета, появляется только 1 ячейка. Если я изменю число секций на 5, появится 5 ячеек. Почему сборщик рисует разделы при использовании объекта макета и элементы при использовании сетки по умолчанию ???? Я что-то упускаю?UICollectionViewLayout. Где все мои предметы?

I подкласс UICollectionViewLayout здесь:

static NSString * const kPadLayoutType = @"gridPads"; 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) { 
     [self setup]; 
    } 
    return self; 
} 

- (void)setup 
{ 
    self.itemInsets = UIEdgeInsetsMake(22.0f, 22.0f, 13.0f, 22.0f); 
    self.itemSize = CGSizeMake(125.0f, 125.0f); 
    self.interItemSpacingY = 12.0f; 
    self.numberOfColumns = 4; 
} 

# pragma mark _____Layout 

- (void)prepareLayout 
{ 
    NSMutableDictionary *newLayoutInfo = [NSMutableDictionary dictionary]; 
    NSMutableDictionary *cellLayoutInfo = [NSMutableDictionary dictionary]; 

    NSInteger sectionCount = [self.collectionView numberOfSections]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; 

    for(NSInteger section = 0; section < sectionCount; section++) { 
     NSInteger itemCount = [self.collectionView numberOfItemsInSection:section]; 

     for(NSInteger item = 0; item < itemCount; item++) { 
      indexPath = [NSIndexPath indexPathForItem:item inSection:section]; 

      UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
      itemAttributes.frame = [self frameForPadAtIndexPath:indexPath]; 

      cellLayoutInfo[indexPath] = itemAttributes; 
     } 
    } 
    newLayoutInfo[kPadLayoutType] = cellLayoutInfo; 
    self.layoutInfo = newLayoutInfo; 
} 

- (CGSize)collectionViewContentSize 
{ 
    return self.collectionView.frame.size; 
} 

- (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray *allAttributes = [NSMutableArray arrayWithCapacity:self.layoutInfo.count]; 

    [self.layoutInfo enumerateKeysAndObjectsUsingBlock:^(NSString *elementIdentifier, 
                NSDictionary *elementsInfo, 
                BOOL *stop) { 
     [elementsInfo enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath, 
                 UICollectionViewLayoutAttributes *attributes, 
                 BOOL *innerStop) { 
      if(CGRectIntersectsRect(rect, attributes.frame)) { 
       [allAttributes addObject:attributes]; 
      } 
     }]; 
    }]; 
    return allAttributes; 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return self.layoutInfo[kPadLayoutType][indexPath]; 
} 

# pragma mark _____Private 

- (CGRect)frameForPadAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSInteger row = indexPath.section/ self.numberOfColumns; 
    NSInteger column = indexPath.section % self.numberOfColumns; 

    CGFloat spacingX = self.collectionView.bounds.size.width - self.itemInsets.left - self.itemInsets.right - (self.numberOfColumns * self.itemSize.width); 

    if(self.numberOfColumns > 1) spacingX = spacingX/(self.numberOfColumns - 1); 

    CGFloat originX = floorf(self.itemInsets.left + (self.itemSize.width + spacingX) * column); 

    CGFloat originY = floor(self.itemInsets.top + (self.itemSize.height + self.interItemSpacingY) * row); 

    return CGRectMake(originX, originY, self.itemSize.width, self.itemSize.height); 
} 

Я недействительности структуры в каждом инкубаторе.

Я использую CollectionView в моем UIViewController В ViewController я зарегистрировал свой класс клеток для использования в viewDidLoad и настройки следующие:

# pragma mark - UICollectionViewDataSource 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 16; 
} 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Pad *myPad = [collectionView dequeueReusableCellWithReuseIdentifier:kPadLayoutType forIndexPath:indexPath]; 
    return myPad; 
} 
+1

Показать код, мог бы помочь устранить проблему – Jasper

ответ

1

Мне кажется, что ваш метод frameForPadAtIndexPath: будет возвращать тот же кадр для каждый элемент в том же разделе и изменяет только положение с секцией.

Изменение

NSInteger row = indexPath.section/ self.numberOfColumns; 
NSInteger column = indexPath.section % self.numberOfColumns; 

в

NSInteger row = indexPath.item/ self.numberOfColumns; 
NSInteger column = indexPath.item % self.numberOfColumns; 

может дать лучшие результаты.

+0

Благодарим вас. – DanMoore

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