2015-06-29 3 views
17

У меня есть простой UICollectionView с UICollectionViewFlowLayout, который использует автозапуск, чтобы обеспечить возможность самостоятельной калибровки ячеек. Вещи отлично работают в статическом макете, но когда я вставить или удалить клетки, клетка изменять размер приблизительного размера:UICollectionView с ячейками для самостоятельной калибровки изменяет размеры ячеек во время вставки/удаления анимации

[self.collectionView performBatchUpdates:^{ 
    [self.collectionView insertItemsAtIndexPaths:@[indexPath]]; 
} completion:nil]; 

Помимо установки ориентировочного размера, как это:

layout.estimatedItemSize = CGSizeMake(88.0, 88.0); 

Я не делая ничего интересного в представлении коллекции. Все настроено с помощью раскадровки.

Как я могу избежать этого изменения размера? Я ориентируюсь только на iOS 8.0 и выше, поэтому он должен поддерживаться.

example of the problem

+4

Удалось решить эту проблему? У меня такая же проблема! – Peymankh

+0

Нет, извините. Я снова спрошу на форумах Apple. На iOS 9 он просто терпит крах, поэтому мне что-то не хватает. – Senior

+0

Я заметил это после того, как поднял аналогичную проблему: http://stackoverflow.com/questions/34045566/uicollectionview-cells-resizing-when-deleting-items-with-estimateditemsize. Удалось ли вам найти решение? –

ответ

0

straightfoward решение для реализации методы UICollectionViewDelegateFlowLayout

func collectionView(_ collectionView: UICollectionView, layoutcollectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     // calculate string size here 
} 

И после вставки или удаления ячеек убедитесь, что вы аннулирование раскладки, так что метод делегата вызывается снова

collectionView.performBatchUpdates({ 
    // insert/delete items here 
}) { (success: Bool) in 
    collectionView.collectionViewLayout.invalidateLayout() 
} 
0
  1. estimatedItemSize собственности для определенного размера.

  2. В вашем обычном UICollectionView класс переопределить ниже метод и размер макета кеша. Размер атрибута определяется супер.

    -(UICollectionViewLayoutAttributes*)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 
    { 
        UICollectionViewLayoutAttributes * superAttr = [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; 
        //Cache size which is returned by super (superAttr.frame.size) since super calculates the correct size for auto size cells. 
        return superAttr; 
    } 
    

3.In sizeForItemAtIndexPath возвращает кэшируется размером, если доступен других предполагаемого размера.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //return cached size if available else the estimated size 
} 
Смежные вопросы

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