重新定位UICollectionViewCells?

时间:2017-06-03 19:09:48

标签: ios objective-c swift uicollectionview uicollectionviewlayout

我想设置我的UICollectionViewCell的位置。在对它进行了一些研究后,我发现了一个解释过程的帖子,但是在objective-c中。我相信我正确地翻译了它但是我无法让它工作。

以下是问题的链接: How do I set the position of a UICollectionViewCell?

这是objective-c

中的答案
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.item == 2) // or whatever specific item you're trying to override
{
    UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    layoutAttributes.frame = CGRectMake(0,0,100,100); // or whatever...
    return layoutAttributes;
}
else
{
    return [super layoutAttributesForItemAtIndexPath:indexPath];
}
}


- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *layoutAttributes = [super layoutAttributesForElementInRect:rect];
if (CGRectContainsRect(rect, CGRectMake(0, 0, 100, 100))) // replace this CGRectMake with the custom frame of your cell...
{
    UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    layoutAttributes.frame = CGRectMake(0,0,100,100); // or whatever...
    return [layoutAttributes arrayByAddingObject:layoutAttributes];
}
else
{
    return layoutAttributes;
}
}

这是我的快速版本

 func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    if (indexPath.section == 0 && indexPath.item == 1) {

        let layoutAttributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
        layoutAttributes.frame = CGRect(x: 0, y: 0, width: 20, height: 50)
        return layoutAttributes
    }
    else
    {
}
    return layoutAttributesForItem(at:indexPath)
}


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

    let layoutAttributes = layoutAttributesForElements(in: rect)! as NSArray

    func contains(_ rect2: CGRect) -> Bool {
        if rect2 == CGRect(x: 0, y: 0, width: 2, height: 50) {
            let layoutAttributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
            layoutAttributes.frame = CGRect(x: 0, y: 0, width: 20, height: 50) // or whatever...
            return layoutAttributes
        }
        else{
            return layoutAttributes
        }

        }
    }

然而,在layoutAttributesForElements中,我收到一条错误,指出indexPath是一个未解析的标识符......

我的VC子类如下 UICollectionViewController,UICollectionViewDelegateFlowLayout,UITextViewDelegate

有什么建议吗?

如果您知道任何其他重新定位UICollectionViewCells的方法,那也很棒。

编辑

我附上了截图。

红色矩形是单元格。我希望它在灰线上 enter image description here

1 个答案:

答案 0 :(得分:2)

为了做到这一点,你需要使用UIViewController并在其中放置一个UICollectionView。

您可以像这样创建一个var:

lazy var collectionView : UICollectionView = {
    layout.scrollDirection = UICollectionViewScrollDirection.horizontal
    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
    cv.delegate = self
    cv.dataSource = self
    cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: self.cellId)
    cv.backgroundColor = UIColor.red
    return cv
}()

注意:您必须使您的UIViewController符合UICollectionViewDataSource & UICollectionViewDelegateFlowLayout并包含所需的方法numberOfItemsInSection & cellForItemAt

如果要移动UICollectionView,可以使用以下方法将其框架设置为新的所需位置:

self.collectionView.frame = <Your_frame>

UICollectionViewController不允许您移动其集合视图实例。