如何在水平集合视图

时间:2016-12-20 05:41:38

标签: ios swift uicollectionview swift3

我有一个水平集合视图,它一次显示5个单元格,我通过 sizeForItemAt 调整了它:

func collectionView(_ collectionView: UICollectionView,
         layout collectionViewLayout: UICollectionViewLayout,
             sizeForItemAt indexPath: IndexPath) -> CGSize {

        return CGSize(width: (self.numberCollectionView?.bounds.size.width)!/5 - 3, height: (self.numberCollectionView?.bounds.size.width)!/5 - 3 )
    }

但是这5个细胞的宽度和高度不同,并且有一个比例。因此中心项目将占整个尺寸的40%,第二第三项目将占据20%的大小和第一第五将占用大小的10%。根据这个比例,项目大小会在滚动上发生变化。这些商品都是标签

修改 不像建议的问题和stackoverflow中的其他问题在我的情况下,只有一行,我有自定义 UICollectionViewFlowLayout 来处理按单元格滚动

1 个答案:

答案 0 :(得分:1)

UICollectionViewFlowLayout来处理按单元格滚动:

class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout {

    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
        var offsetAdjustment = CGFloat.greatestFiniteMagnitude
        let horizontalOffset = proposedContentOffset.x
        let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: self.collectionView!.bounds.size.width, height: self.collectionView!.bounds.size.height)

        for layoutAttributes in super.layoutAttributesForElements(in: targetRect)! {
            let itemOffset = layoutAttributes.frame.origin.x
            if (abs(itemOffset - horizontalOffset) < abs(offsetAdjustment)) {
                offsetAdjustment = itemOffset - horizontalOffset
            }
        }

        return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y)
    }

}

然后找到CollectionView

的中心单元格
private func findCenterIndex() -> Int {
        let center = self.view.convert(numberCollectionView.center, to: self.numberCollectionView)
        let row = numberCollectionView!.indexPathForItem(at: center)?.row


        guard let index = row else {

            return 0
        }

        self.rating = index

        return index

    }
scrollViewDidScroll已转换的单元格下的

func scrollViewDidScroll(_ scrollView: UIScrollView) {


            transformCell()

    }



    private func transformCell() {


        let row =  findCenterIndex()

        var offset : Float = 0.0

        for cell in numberCollectionView.visibleCells as! [VotingCell] {

            if row == numberCollectionView.indexPath(for: cell)?.row {

                offset = 1.1
                cell.label.font = UIFont.boldSystemFont(ofSize: 28.0)
                cell.label.textColor = UIColor.black
                cell.alpha = 1.0
                cell.label.textAlignment = .center
            }
            else if row == (numberCollectionView.indexPath(for: cell)?.row)! + 1 || row == (numberCollectionView.indexPath(for: cell)?.row)! - 1
            {
                offset = 0.8
                cell.label.font = UIFont(name: cell.label.font.fontName, size: 26.0)
                cell.label.textColor = UIColor.gray
                cell.alpha = 0.8
                cell.label.textAlignment = .center

            }
            else if row == (numberCollectionView.indexPath(for: cell)?.row)! + 2 || row == (numberCollectionView.indexPath(for: cell)?.row)! - 2 {

                offset = 0.7
                cell.label.font = UIFont(name: cell.label.font.fontName, size: 20.0)
                cell.label.textColor = UIColor.gray
                cell.alpha = 0.8
                cell.label.textAlignment = .center
            }
            else
            {
                offset = 0.00

            }


            cell.transform = CGAffineTransform.identity
            cell.transform = CGAffineTransform(scaleX: CGFloat(offset), y: CGFloat(offset))

        }
    }

还从transformCell()调用viewDidLayoutSubviews进行初始加载。