В UICollectionView ячейки не будут сидеть на дне

Примечание оказалось, что это была простая ошибка, чтобы ячейки не "сидели на дне". Однако интересный вопрос: "Как перемещать ячейки вверх и вниз". Ниже решения грубой силы: создайте собственный макет потока.

Я был поражен тем, что единственный способ сделать это - полностью подкласс UICollectionViewFlowLayout и написать некоторый хитрый код в layoutAttributesForElementsInRect.

Возможно, это поможет кому-то в будущем, так как для layoutAttributesForElementsInRect очень мало примеров кода. Надеюсь, что это поможет.

-

Оказывается причина, по которой мои ячейки не будут сидеть внизу, заключалась в том, что я ранее имел это в своем UICollectionViewController...

-(void)viewDidLoad
{
[super viewDidLoad];
// the following code is very useful to, for example,
// "nudge short lists towards the middle..." - if you want the list
// to more sit in the middle of the screen, when only a few items.
cvHeight = CGRectGetHeight(self.collectionView.bounds);
[self.collectionView setContentInset:
       UIEdgeInsetsMake(cvHeight * 0.175, 0, cvHeight * 0.30, 0) ]; //top,l,b,r
}

конечно, когда я изменился на "размер ячейки полного вида" (по одной ячейке на экран), этот код не работает.


У меня есть простой вид UICollection, который представляет собой ширину iPhone и около 250. Ячейки имеют тот же размер, что и представление коллекции.

Клетки не центрируются, они всегда сидят высоко. (то есть вне представления.)

enter image description here

Мой размер коллекции "размеры" в раскадровке - всего лишь нуль. В чем может быть проблема?

Ответ 1

Вот один из способов "грубой силы" решить проблему - написать свой собственный FlowLayout !!

Это работает...

class SimpleFlowLayout: UICollectionViewFlowLayout {


override init() {
    super.init()

    initialize()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initialize()
}

func initialize() {
    self.scrollDirection = .horizontal
    self.minimumInteritemSpacing = 0.0
    self.minimumLineSpacing = 0.0

}

override var collectionViewContentSize: CGSize {

    return super.collectionViewContentSize
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {


    let allItems = super.layoutAttributesForElements(in: rect)
    for  attribute in allItems! {
        print ("attribute.frame.origin.y  .....  \(attribute.frame.origin.y)")
        attribute.frame = CGRect(x: attribute.frame.origin.x,
                                 y: attribute.frame.origin.y + 34,
                             width: attribute.frame.size.width,
                            height: attribute.frame.size.height)

            // "go figure" ... add 34
    }

    return allItems;

}

То, как вы "устанавливаете" UICollectionViewFlowLayout, в основном так...

class YourFancyDisplay: UICollectionViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView!.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
        collectionView!.collectionViewLayout = SimpleFlowLayout()
        ...

Ответ 2

Попробуйте это. надеюсь, это может помочь

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return collectionView.frame.size;
}

(Для будущих читателей, действительно, вы также, как правило, нуждаетесь в другом...)

-(CGSize) collectionView:(UICollectionView *)collectionView
     layout:(UICollectionViewLayout *)collectionViewLayout
     sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
    return self.view.frame.size;
    }

-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView
   layout:(UICollectionViewLayout*)collectionViewLayout
   insetForSectionAtIndex:(NSInteger)section
    {
    return UIEdgeInsetsMake(0,0,0,0);   //t,l,b,r
    }