在UICollectionView中,单元格不会位于底部

时间:2014-07-23 16:30:01

标签: ios uicollectionview uicollectionviewcell

注意结果证明这是一个简单的错误,细胞不会“坐在底部”。然而,这是一个有趣的问题:“如何上下移动细胞。”在蛮力解决方案下面:编写自己的流程布局。

令我感到惊讶的是,唯一的方法就是完成子类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

故事板中的我的集合视图“大小”都只是零。可能是什么问题?

2 个答案:

答案 0 :(得分:3)

这里有一个蛮力"解决问题的方法 - 编写自己的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()
        ...

答案 1 :(得分:1)

试试这个。希望它可以帮助

-(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
    }