如何在编辑时将我的集合视图单元格设置为更小的动画?
How can I animate my collection view cells smaller while editing?
所以我有一个集合视图,每行放置 2 个单元格。当我进入编辑模式时,我希望所有单元格的大小都减小。我尝试向它们添加填充以获得所需的效果,但我需要它们进行动画处理!我怎么能做到这一点。请在下面查看我的代码:
视图加载时的初始设置:
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = editButtonItem
navigationController?.isToolbarHidden = true
// Does not allow to move items around innitialy
installsStandardGestureForInteractiveMovement = false
// set collectionView item size
//let width = collectionView!.frame.width/2
let layout = collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 2.0 * itemsPerRow
let availableWidth = view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 4.0
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
}
然后这就是在点击 "edit" 时调用的内容
func reduceCellSize() {
if isEditing {
let layout = self.collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 8.0 * itemsPerRow
let availableWidth = self.view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 6.0
layout.sectionInset.left = 5
layout.sectionInset.right = 5
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
} else {
let layout = collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 2.0 * itemsPerRow
let availableWidth = view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 4.0
layout.sectionInset.left = 0
layout.sectionInset.right = 0
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
}
}
在 reduceCellSize 方法结束时试试这个:
UIView.animate(duration: 0.3) {
self.collectionView.layoutIfNeeded()
}
(将 "collectionView" 替换为您的集合视图的实际名称。)
这应该会导致集合视图以动画方式调整其子视图的大小。
你需要的是CGAffineTransform
。所以你可以像这样设置它们的整体大小:
private func transformCell() {
var offset : Float = 0.0
for cell in numberCollectionView.visibleCells as! [MyCell] {
offset = 0.07
cell.transform = CGAffineTransform.identity
cell.transform = CGAffineTransform(scaleX: CGFloat(offset), y: CGFloat(offset))
}
}
它会根据偏移值将可见单元格变换成不同的大小,您可以从scrollViewDidScroll
调用它
func scrollViewDidScroll(_ scrollView: UIScrollView) {
transformCell()
}
所以我有一个集合视图,每行放置 2 个单元格。当我进入编辑模式时,我希望所有单元格的大小都减小。我尝试向它们添加填充以获得所需的效果,但我需要它们进行动画处理!我怎么能做到这一点。请在下面查看我的代码:
视图加载时的初始设置:
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = editButtonItem
navigationController?.isToolbarHidden = true
// Does not allow to move items around innitialy
installsStandardGestureForInteractiveMovement = false
// set collectionView item size
//let width = collectionView!.frame.width/2
let layout = collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 2.0 * itemsPerRow
let availableWidth = view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 4.0
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
}
然后这就是在点击 "edit" 时调用的内容
func reduceCellSize() {
if isEditing {
let layout = self.collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 8.0 * itemsPerRow
let availableWidth = self.view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 6.0
layout.sectionInset.left = 5
layout.sectionInset.right = 5
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
} else {
let layout = collectionViewLayout as! UICollectionViewFlowLayout
let itemsPerRow: CGFloat = 2.0
let paddingSpace: CGFloat = 2.0 * itemsPerRow
let availableWidth = view.frame.width - paddingSpace
let widthPerItem = availableWidth / itemsPerRow
layout.minimumLineSpacing = 4.0
layout.sectionInset.left = 0
layout.sectionInset.right = 0
layout.itemSize = CGSize(width: widthPerItem, height: widthPerItem)
}
}
在 reduceCellSize 方法结束时试试这个:
UIView.animate(duration: 0.3) {
self.collectionView.layoutIfNeeded()
}
(将 "collectionView" 替换为您的集合视图的实际名称。)
这应该会导致集合视图以动画方式调整其子视图的大小。
你需要的是CGAffineTransform
。所以你可以像这样设置它们的整体大小:
private func transformCell() {
var offset : Float = 0.0
for cell in numberCollectionView.visibleCells as! [MyCell] {
offset = 0.07
cell.transform = CGAffineTransform.identity
cell.transform = CGAffineTransform(scaleX: CGFloat(offset), y: CGFloat(offset))
}
}
它会根据偏移值将可见单元格变换成不同的大小,您可以从scrollViewDidScroll
func scrollViewDidScroll(_ scrollView: UIScrollView) {
transformCell()
}