如何在自定义动画中访问 toView 对象的框架
How access frame of a toView object in custom animation
我想制作类似iOS主屏幕文件夹的动画,我必须知道"folder"的最终位置的帧:
我正在使用自定义过渡,这是动画文件的代码:
class FolderAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
let duration = 5.0
var presenting = true
func transitionDuration(_ transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView()
let toViewC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey)! as! ProjectViewController
let fromViewC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey)!as! ViewController
let cell : FolderCollectionViewCell = fromViewC.folderCollectionView.cellForItem(at: (fromViewC.folderCollectionView.indexPathsForSelectedItems()?.first!)!) as! FolderCollectionViewCell
let cellSnapshot: UIView = cell.snapshotView(afterScreenUpdates: false)!
let cellFrame = containerView.convert(cell.frame, from: cell.superview)
cellSnapshot.frame = cellFrame
cell.isHidden = true
toViewC.view.frame = transitionContext.finalFrame(for: toViewC)
toViewC.view.alpha = 0
containerView.addSubview(toViewC.view)
containerView.addSubview(cellSnapshot)
UIView.animate(withDuration: duration, animations: {
toViewC.view.alpha = 1.0
let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view)
cellSnapshot.frame = finalFrame
}) { (_) in
cellSnapshot.removeFromSuperview()
transitionContext.completeTransition(true)
}
}
}
除了 let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view)
将 finalFrame
值(是一个 CGRect 变量)设置为 (origin = (x = 0, y = 0), size = (width = 0, height = 0))
.
之外,其他都正常工作
我已遵循 this 教程,在 Swift
中编写我的代码
那么,我怎样才能正确访问 属性?
框架是零矩形,因为在您访问它时,视图的布局传递尚未发生。设置 toVC.view
框架后,添加此行:
toVC.view.layoutIfNeeded()
如果您有兴趣,我已经写过有关在视图控制器转换中使用快照的文章 here。
我想制作类似iOS主屏幕文件夹的动画,我必须知道"folder"的最终位置的帧:
我正在使用自定义过渡,这是动画文件的代码:
class FolderAnimationController: NSObject, UIViewControllerAnimatedTransitioning {
let duration = 5.0
var presenting = true
func transitionDuration(_ transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView()
let toViewC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey)! as! ProjectViewController
let fromViewC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey)!as! ViewController
let cell : FolderCollectionViewCell = fromViewC.folderCollectionView.cellForItem(at: (fromViewC.folderCollectionView.indexPathsForSelectedItems()?.first!)!) as! FolderCollectionViewCell
let cellSnapshot: UIView = cell.snapshotView(afterScreenUpdates: false)!
let cellFrame = containerView.convert(cell.frame, from: cell.superview)
cellSnapshot.frame = cellFrame
cell.isHidden = true
toViewC.view.frame = transitionContext.finalFrame(for: toViewC)
toViewC.view.alpha = 0
containerView.addSubview(toViewC.view)
containerView.addSubview(cellSnapshot)
UIView.animate(withDuration: duration, animations: {
toViewC.view.alpha = 1.0
let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view)
cellSnapshot.frame = finalFrame
}) { (_) in
cellSnapshot.removeFromSuperview()
transitionContext.completeTransition(true)
}
}
}
除了 let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view)
将 finalFrame
值(是一个 CGRect 变量)设置为 (origin = (x = 0, y = 0), size = (width = 0, height = 0))
.
我已遵循 this 教程,在 Swift
中编写我的代码那么,我怎样才能正确访问 属性?
框架是零矩形,因为在您访问它时,视图的布局传递尚未发生。设置 toVC.view
框架后,添加此行:
toVC.view.layoutIfNeeded()
如果您有兴趣,我已经写过有关在视图控制器转换中使用快照的文章 here。