在我的应用程序中,有一个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
中列为最低IndexPath
的collectionView?.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/