Ios Swift collectionview单元格动画仅在滚动时运行
我正在尝试在列表和网格布局之间设置collectionview的动画 它可以在两个布局之间设置动画,但是我不知道如何设置一些约束的动画 例如: 这只会在我开始滚动并在屏幕上显示新项目时更改约束。我想在更改布局时更改约束 更改布局的方法:Ios Swift collectionview单元格动画仅在滚动时运行,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我正在尝试在列表和网格布局之间设置collectionview的动画 它可以在两个布局之间设置动画,但是我不知道如何设置一些约束的动画 例如: 这只会在我开始滚动并在屏幕上显示新项目时更改约束。我想在更改布局时更改约束 更改布局的方法: @IBAction func gridButtonDidTouch(_ sender: AnyObject) { if collectionView.collectionViewLayout == gridLayout {
@IBAction func gridButtonDidTouch(_ sender: AnyObject) {
if collectionView.collectionViewLayout == gridLayout {
// list layout
UIView.animate(withDuration: 0.1, animations: {
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.setCollectionViewLayout(self.listLayout, animated: false)
})
} else {
// grid layout
UIView.animate(withDuration: 0.1, animations: {
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.setCollectionViewLayout(self.gridLayout, animated: false)
})
}
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
class GridLayout: UICollectionViewFlowLayout {
var numberOfColumns: Int = 3
init(numberOfColumns: Int) {
super.init()
minimumLineSpacing = 1
minimumInteritemSpacing = 1
self.numberOfColumns = numberOfColumns
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var itemSize: CGSize {
get {
if let collectionView = collectionView {
let itemWidth: CGFloat = (collectionView.frame.width/CGFloat(self.numberOfColumns)) - self.minimumInteritemSpacing
let itemHeight: CGFloat = 260.0
return CGSize(width: itemWidth, height: itemHeight)
}
// Default fallback
return CGSize(width: 100, height: 100)
}
set {
super.itemSize = newValue
}
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
return proposedContentOffset
}
}
class ListLayout: UICollectionViewFlowLayout {
var itemHeight: CGFloat = 180
init(itemHeight: CGFloat) {
super.init()
minimumLineSpacing = 1
minimumInteritemSpacing = 1
self.itemHeight = itemHeight
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var itemSize: CGSize {
get {
if let collectionView = collectionView {
let itemWidth: CGFloat = collectionView.frame.width
return CGSize(width: itemWidth, height: self.itemHeight)
}
// Default fallback
return CGSize(width: 100, height: 100)
}
set {
super.itemSize = newValue
}
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
return proposedContentOffset
}
}
你试过在“self.collectionView.setCollectionViewLayout(self.listlaway,animated:false)”中将“animated”改为true吗?@almas是的,我试过了,同样的事情也发生了。你试过在“self.collectionView.setCollectionViewLayout(self.listlawlayout,animated:false)”中将“animated”改为true吗?@almas是的,我试过,同样的事情也会发生
@IBAction func gridButtonDidTouch(_ sender: AnyObject) {
if collectionView.collectionViewLayout == gridLayout {
// list layout
UIView.animate(withDuration: 0.1, animations: {
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.setCollectionViewLayout(self.listLayout, animated: false)
})
} else {
// grid layout
UIView.animate(withDuration: 0.1, animations: {
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.setCollectionViewLayout(self.gridLayout, animated: false)
})
}
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
class GridLayout: UICollectionViewFlowLayout {
var numberOfColumns: Int = 3
init(numberOfColumns: Int) {
super.init()
minimumLineSpacing = 1
minimumInteritemSpacing = 1
self.numberOfColumns = numberOfColumns
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var itemSize: CGSize {
get {
if let collectionView = collectionView {
let itemWidth: CGFloat = (collectionView.frame.width/CGFloat(self.numberOfColumns)) - self.minimumInteritemSpacing
let itemHeight: CGFloat = 260.0
return CGSize(width: itemWidth, height: itemHeight)
}
// Default fallback
return CGSize(width: 100, height: 100)
}
set {
super.itemSize = newValue
}
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
return proposedContentOffset
}
}
class ListLayout: UICollectionViewFlowLayout {
var itemHeight: CGFloat = 180
init(itemHeight: CGFloat) {
super.init()
minimumLineSpacing = 1
minimumInteritemSpacing = 1
self.itemHeight = itemHeight
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var itemSize: CGSize {
get {
if let collectionView = collectionView {
let itemWidth: CGFloat = collectionView.frame.width
return CGSize(width: itemWidth, height: self.itemHeight)
}
// Default fallback
return CGSize(width: 100, height: 100)
}
set {
super.itemSize = newValue
}
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
return proposedContentOffset
}
}