在我的应用程序中,有一个UICollectionViewController可以更改UICollectionViewLayout。自定义UICollectionViewFlowLayout只会更改单元格的高度。问题是当设置新的UICollectionViewFlowLayout时,我的UICollectionView中的位置会完全改变,尤其是我越靠后。我的目标是在更新UICollectionViewCell之后,使位于顶部(但未被导航栏隐藏甚至不位于顶部)的UICollectionViewLayout保持在视图顶部。

这是关于我如何解决它的一些代码:

class PacksCollectionViewLayout: UICollectionViewFlowLayout {

    convenience init(height: CGFloat) {
        self.init()
        itemSize = CGSize(width: 80, height: height)
        minimumInteritemSpacing = 10
        minimumLineSpacing = 10
        sectionInset.left = 10
        sectionInset.right = 10
        scrollDirection = .vertical
    }

    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
        return collectionView!.contentOffset
    }
}

class PacksCollectionViewController: UICollectionViewController {

    var largeCells = false {

        let height:CGFloat = largeCells ? 110 : 80
        var lowestIndexPath:IndexPath? {
            return self.collectionView?.indexPathsForVisibleItems.min()
        }

        UIView.animate(withDuration: 0.3){
            self.collectionView?.collectionViewLayout.invalidateLayout()
            self.collectionView?.setCollectionViewLayout(PacksCollectionViewLayout(height: height), animated: true)
            if let index = lowestIndexPath{
                self.collectionView?.scrollToItem(at: index, at: .top, animated: false)
            }
        }
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 100
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        return collectionView.dequeueReusableCell(withReuseIdentifier: PacksCollectionViewCell.identifier, for: indexPath)
    }
}


尝试滚动到UICollectionViewCell中列为最低IndexPathcollectionView?.indexPathsForVisibleItems时,它会向上移动,因为这些单元格显然仍然仍然可见。有什么解决办法吗?

最佳答案

这就是我的做法,希望对您有所帮助,对不起,如果没有
所以在您的流布局上添加此代码

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}

override init() {
    super.init()
    commonInit()
}

func commonInit() {
    minimumLineSpacing = 10.0
}

fun yourCollectionView(collectionView: UICollectionView, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: collectionView.bounds.width, height: 230.0)
}


并在您的主收集控制器上添加此

  let layout = yourFlowLayout()



   override func viewDidLoad() {
    super.viewDidLoad()

 collectionView?.collectionViewLayout = layout


 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return layout.yourCollectionView(collectionView, sizeForItemAtIndexPath: indexPath)
}


我希望这会有所帮助:)

关于ios - 如何增加UICollectionViewCell的高度并保持在ScrollView中的相同位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38946596/

10-13 03:55