我想设置我的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的方法,那也很棒。
编辑
我附上了截图。
答案 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不允许您移动其集合视图实例。