iOS Swift 3:UICollectionView 水平中心和更大的单元格

Posted

技术标签:

【中文标题】iOS Swift 3:UICollectionView 水平中心和更大的单元格【英文标题】:iOS Swift 3: UICollectionView horizontal center and bigger cell 【发布时间】:2017-04-10 07:05:05 【问题描述】:

我想构建一个像这样的集合视图: Collection View

它的中心有更大的单元格,单元格被捕捉到容器视图的中心,但是使用 Swift 3。我不想使用库,因为我想学习如何构建这样的自定义集合视图。

我已经搜索过 SO,但尚未找到任何合适的解决方案

【问题讨论】:

嗨,如果有帮助,请检查链接并投票。 github.com/ink-spot/UPCarouselFlowLayout 这个很好用,我怎么能接受这个答案? 只需按下标志上方的按钮投票,您可以通过将指针悬停在我的答案上找到两者。谢谢。 如果 ans 正确,则标记为 write ans.. 【参考方案1】:

编写那个函数

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: collectionView.frame.size.width, height: collectionView.frame.size.height)
    

制作集合视图 [滚动方向] 水平

和[scrolling]勾选滚动启用和分页启用

让细胞变大

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 

    let offSet = self.collectionView.contentOffset
    let width = self.collectionView.bounds.size.width

    let index = round(offSet.x / width)
    let newPoint = CGPoint(x: index * size.width, y: offSet.y)


    coordinator.animate(alongsideTransition:  (UIViewControllerTransitionCoordinatorContext) in

    ,completion: (UIVIewTransitionCoordinatorContext) in
        self.collectionView.reloadData()
        self.collectionView.setContentOffset(newPoint, animated: true)
    )


【讨论】:

如何使中心单元格大于左右单元格?【参考方案2】:

要实现这一点,您需要继承 UICollectionViewFlowLayout 并覆盖:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

然后调用 super.layoutAt... 并更改它通过其 .transform 属性返回的单元格并返回您更改的属性

这是我之前做的一个例子。

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

var att = super.layoutAttributesForElements(in: rect)!

if !(delegate?.reelPlayerFlowIsPreviewMode() ?? true) 
    return att

let region = CGRect(x: (self.collectionView?.contentOffset.x)!,
                    y: (self.collectionView?.contentOffset.y)!,
                    width: (self.collectionView?.bounds.size.width)!,
                    height: (self.collectionView?.bounds.size.height)!)

let center = CGPoint(x: region.midX, y: region.midY)

for theCell in att 

    print("\(theCell.indexPath.item)\n\(theCell)\n")
    let cell = theCell.copy() as! UICollectionViewLayoutAttributes
    var f = cell.frame
    let cellCenter = CGPoint(x: f.midX, y: f.midY)
    let realDistance = min(center.x - cellCenter.x, region.width)
    let distance = abs(realDistance)
    let d = (region.width - distance) / region.width
    let p = (max(d, ReelPlayerFlowLayout.minPercent) * ReelPlayerFlowLayout.maxPercent)

    f.origin.x += (realDistance * ((1 - ReelPlayerFlowLayout.maxPercent) + (ReelPlayerFlowLayout.maxPercent - ReelPlayerFlowLayout.minPercent)))

    cell.frame = f
    cell.size = CGSize (width: f.width * p, height: f.height * p)            
    let index = att.index(of: theCell)!
    att[index] = cell


return att

【讨论】:

以上是关于iOS Swift 3:UICollectionView 水平中心和更大的单元格的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式在 UITableViewCell 中创建一个 UICollectionView

iOS开发系列--Swift 3.0

Swift 3 iOS 兼容性

Swift 3 - iOS 11.2 上的 UICollectionview 问题

swift 3 ios:UILabel

iOS -Swift 3.0 -for(循环语句用法)