Ios Swift如何在collectionView中获取中心单元格并在滚动时调整其大小?

Ios Swift如何在collectionView中获取中心单元格并在滚动时调整其大小?,ios,swift,uicollectionviewcell,Ios,Swift,Uicollectionviewcell,我有一个水平的collectionView,我想在滚动它时管理它,中心单元格会变大。因此,每次一个细胞是中心细胞,它都会比其他细胞大。检查下面的图像。 有人能帮我找到最好的方法吗?提前谢谢 到目前为止,我的代码是: import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { @IBOutlet var horizontalCol

我有一个水平的collectionView,我想在滚动它时管理它,中心单元格会变大。因此,每次一个细胞是中心细胞,它都会比其他细胞大。检查下面的图像。

有人能帮我找到最好的方法吗?提前谢谢

到目前为止,我的代码是:

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource,      UICollectionViewDelegate {
@IBOutlet var horizontalCollectionView: UICollectionView!
@IBOutlet var verticalCollectionView: UICollectionView!

var horizontal = ["1","2","3","4","5","6","7","8","9","10","1","2","3","4","5","6","7","8","9","10"]
var horizontalCellSize = CGSize(width: 50, height: 50)
var horizontalLargeCellSize = CGSize(width: 80, height: 80)


var centerCell = UICollectionViewCell()
var cellIsInCenter = false
var myIndexPath = IndexPath()

override func viewDidLoad() {
    super.viewDidLoad()

}

// When the main view's dimensions change this will re-layout the collection view
override func viewWillLayoutSubviews() {
    verticalCollectionView.collectionViewLayout.invalidateLayout()
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return horizontal.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if collectionView == horizontalCollectionView {
        let horizontalCell = collectionView.dequeueReusableCell(withReuseIdentifier: "HorizontalCell", for: indexPath) as! HorizontalCell
        horizontalCell.backgroundColor = UIColor.blue
        horizontalCell.textLabel.text = horizontal[indexPath.row]
        return horizontalCell
    }

   else {

        let verticalCell = collectionView.dequeueReusableCell(withReuseIdentifier: "VerticalCell", for: indexPath) as! VerticalCell
        verticalCell.backgroundColor = UIColor.red
        verticalCell.textLabel.text = horizontal[indexPath.row]
        return verticalCell
    }
}

// MARK: UIScrollViewDelegate

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView == self.horizontalCollectionView {
        let horizontalScrollPosition = scrollView.contentOffset.x * 35
        self.verticalCollectionView.delegate = nil
        self.verticalCollectionView.contentOffset = CGPoint(x: 0, y: horizontalScrollPosition)
        self.verticalCollectionView.delegate = self
    }

    if scrollView == self.verticalCollectionView {
        let verticalScrollPosition = scrollView.contentOffset.y
        self.horizontalCollectionView.delegate = nil
        self.horizontalCollectionView.contentOffset = CGPoint(x: verticalScrollPosition, y: 0)
        self.horizontalCollectionView.delegate = self 
    }
}


// MARK: CollectionViewLayout

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    if collectionView == verticalCollectionView {
        let size = CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height)

        return size
    }

    if indexPath.item == 3 {
        return CGSize(width: 70, height: 70)
    }
    return CGSize(width: 50, height: 50)

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.verticalCollectionView.scrollToItem(at: indexPath, at: .centeredVertically, animated: true)
    print("\(indexPath)")
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    var closestCell: UICollectionViewCell = self.horizontalCollectionView.visibleCells[0]
    for cell in self.horizontalCollectionView.visibleCells as [UICollectionViewCell] {
        let closestCellDelta = abs(closestCell.center.x - self.horizontalCollectionView.bounds.size.width / 2.0 - self.horizontalCollectionView.contentOffset.x)
        let cellDelta = abs(cell.center.x - self.horizontalCollectionView.bounds.size.width/2.0 - self.horizontalCollectionView.contentOffset.x)
        if (cellDelta < closestCellDelta){
            closestCell = cell
            self.centerCell = cell
            self.cellIsInCenter = true
            horizontalCellSize = CGSize(width: 80, height: 50)
        }
    }
    let indexPath = self.horizontalCollectionView.indexPath(for: closestCell)
    self.horizontalCollectionView.scrollToItem(at: indexPath!, at: .centeredHorizontally , animated: true)
    if closestCell.backgroundColor == UIColor.black {
        closestCell.backgroundColor = UIColor.blue
    }
    horizontalCollectionView.reloadItems(at: [self.horizontalCollectionView.indexPath(for: closestCell)!])
    closestCell.backgroundColor = UIColor.black
}
}
导入UIKit
类ViewController:UIViewController、UICollectionViewDataSource、UICollectionViewDelegate{
@IBVar horizontalCollectionView:UICollectionView!
@IBOutlet var verticalCollectionView:UICollectionView!
水平风险值=[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”]
var horizontalCellSize=CGSize(宽度:50,高度:50)
var HorizontalArgeCellSize=CGSize(宽:80,高:80)
var centerCell=UICollectionViewCell()
var cellIsInCenter=false
var myindepath=indepath()
重写func viewDidLoad(){
super.viewDidLoad()
}
//当主视图的尺寸更改时,这将重新布局集合视图
重写func viewWillLayoutSubviews(){
verticalCollectionView.collectionViewLayout.invalidateLayout()
}
func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{
返回水平计数
}
func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{
如果collectionView==水平collectionView{
将horizontalCell=collectionView.dequeueReusableCell(带有reuseidentifier:“horizontalCell”,for:indexath)设为!horizontalCell
horizontalCell.backgroundColor=UIColor.blue
horizontalCell.textLabel.text=水平[indexPath.row]
返回水平细胞
}
否则{
让verticalCell=collectionView.DequeueReuseAbleCell(使用ReuseIdentifier:“verticalCell”,for:indexPath)作为!verticalCell
verticalCell.backgroundColor=UIColor.red
verticalCell.textLabel.text=水平[indexPath.row]
返回垂直电池
}
}
//MARK:UIScrollViewDelegate
func scrollViewDidScroll(scrollView:UIScrollView){
如果scrollView==self.horizontalCollectionView{
设horizontalScrollPosition=scrollView.contentOffset.x*35
self.verticalCollectionView.delegate=nil
self.verticalCollectionView.contentOffset=CGPoint(x:0,y:horizontalScrollPosition)
self.verticalCollectionView.delegate=self
}
如果scrollView==self.verticalCollectionView{
设verticalScrollPosition=scrollView.contentOffset.y
self.horizontalCollectionView.delegate=nil
self.horizontalCollectionView.contentOffset=CGPoint(x:verticalScrollPosition,y:0)
self.horizontalCollectionView.delegate=self
}
}
//标记:CollectionViewLayout
func collectionView(collectionView:UICollectionView,
布局集合视图布局:UICollectionViewLayout,
SizeFormiteIndeXPath indexPath:NSIndexPath)->CGSize{
如果collectionView==verticalCollectionView{
let size=CGSize(宽度:collectionView.bounds.width,高度:collectionView.bounds.height)
返回大小
}
如果indexath.item==3{
返回CGSize(宽:70,高:70)
}
返回CGSize(宽:50,高:50)
}
func collectionView(collectionView:UICollectionView,didSelectItemAt indexPath:indexPath){
self.verticalCollectionView.scrollToItem(at:indepath,at:.centeredVertical,动画:true)
打印(“\(indexPath)”)
}
func ScrollViewDiEndDecelling(scrollView:UIScrollView){
var closestCell:UICollectionViewCell=self.horizontalCollectionView.VisibleCell[0]
对于self.horizontalCollectionView.visibleCells中的单元格作为[UICollectionViewCell]{
设closestcelldta=abs(closestCell.center.x-self.horizontalCollectionView.bounds.size.width/2.0-self.horizontalCollectionView.contentOffset.x)
设cellDelta=abs(cell.center.x-self.horizontalCollectionView.bounds.size.width/2.0-self.horizontalCollectionView.contentOffset.x)
if(cellDelta
试试这个:

func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if collectionView == verticalCollectionView {
let size = CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height)
        return size
    }
let point = CGPoint(x: self.view.frame.size.width/2.0, y:35 )
//or you can try this code also
//let point = CGPoint(x: UIScreen.main.bounds.width/2, y:35 )
    print(point)
let centerIndex = self.collectionView.indexPathForItemAtPoint(point)
    if indexPath.item == centerIndex {
        return CGSize(width: 70, height: 70)
    }
    return CGSize(width: 50, height: 50)
}
此代码为您提供集合视图中心项的索引。
希望这有帮助

尝试使用伊卡鲁塞尔图书馆谢谢易卜拉欣,我宁愿不用图书馆来解决它。因为我还在学习,我希望它能帮助我进步。谢谢你的帮助。不幸的是,它不起作用。它只接收第一项。如果打印centerIndex,则得到0,0。我还想到,我们需要得到可见单元格中中心项的索引?