如何使用 Hero Animation 为集合视图单元格设置动画?
How to Animate collection view cells using Hero Animation?
如何在 iOS 中设置集合视图单元格的动画,例如从左右门关闭或滑动。
像这样:
这是关门之类的动画集合视图单元格的代码。
此集合有 2 列。
我已经为集合视图单元格大小的 UICollectionViewDelegateFlowLayout 方法添加了代码。
您可以根据您的要求自定义或更改它。
这段代码展示了一种生成关门动画的简单方法。
// MARK: - UICollectionViewDelegateFlowLayout
extension SettingsViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width:CGFloat(settingsCollectionView.frame.size.width * 0.46), height: settingsCollectionView.frame.size.height * 0.25)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// create a new cell if needed or reuse an old one
let cell: SettingsCollectionCell = settingsCollectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! SettingsCollectionCell
if !cell.isAnimated {
UIView.animate(withDuration: 0.5, delay: 0.5 * Double(indexPath.row), usingSpringWithDamping: 1, initialSpringVelocity: 0.5, options: indexPath.row % 2 == 0 ? .transitionFlipFromLeft : .transitionFlipFromRight, animations: {
if indexPath.row % 2 == 0 {
AnimationUtility.viewSlideInFromLeft(toRight: cell)
}
else {
AnimationUtility.viewSlideInFromRight(toLeft: cell)
}
}, completion: { (done) in
cell.isAnimated = true
})
}
return cell
}
}
这是 AnimationUtility class 的代码。
class AnimationUtility: UIViewController, CAAnimationDelegate {
static let kSlideAnimationDuration: CFTimeInterval = 0.4
static func viewSlideInFromRight(toLeft views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromRight
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromLeft(toRight views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromLeft
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromTop(toBottom views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromBottom
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromBottom(toTop views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromTop
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
}
如何在 iOS 中设置集合视图单元格的动画,例如从左右门关闭或滑动。
像这样:
这是关门之类的动画集合视图单元格的代码。 此集合有 2 列。 我已经为集合视图单元格大小的 UICollectionViewDelegateFlowLayout 方法添加了代码。 您可以根据您的要求自定义或更改它。
这段代码展示了一种生成关门动画的简单方法。
// MARK: - UICollectionViewDelegateFlowLayout
extension SettingsViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width:CGFloat(settingsCollectionView.frame.size.width * 0.46), height: settingsCollectionView.frame.size.height * 0.25)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// create a new cell if needed or reuse an old one
let cell: SettingsCollectionCell = settingsCollectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) as! SettingsCollectionCell
if !cell.isAnimated {
UIView.animate(withDuration: 0.5, delay: 0.5 * Double(indexPath.row), usingSpringWithDamping: 1, initialSpringVelocity: 0.5, options: indexPath.row % 2 == 0 ? .transitionFlipFromLeft : .transitionFlipFromRight, animations: {
if indexPath.row % 2 == 0 {
AnimationUtility.viewSlideInFromLeft(toRight: cell)
}
else {
AnimationUtility.viewSlideInFromRight(toLeft: cell)
}
}, completion: { (done) in
cell.isAnimated = true
})
}
return cell
}
}
这是 AnimationUtility class 的代码。
class AnimationUtility: UIViewController, CAAnimationDelegate {
static let kSlideAnimationDuration: CFTimeInterval = 0.4
static func viewSlideInFromRight(toLeft views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromRight
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromLeft(toRight views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromLeft
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromTop(toBottom views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromBottom
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
static func viewSlideInFromBottom(toTop views: UIView) {
var transition: CATransition? = nil
transition = CATransition.init()
transition?.duration = kSlideAnimationDuration
transition?.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition?.type = kCATransitionPush
transition?.subtype = kCATransitionFromTop
// transition?.delegate = (self as! CAAnimationDelegate)
views.layer.add(transition!, forKey: nil)
}
}