iOS 홈 화면 폴더와 같은 애니메이션을 만들고 싶습니다. 기본보기 컨트롤러와 컨테이너보기에 컨테이너보기가 있습니다. 애니메이션이있는 두 개의보기 컨트롤러 사이를 전환합니다.애니메이션 중에 프레임 값이 잘못되었습니다.
- 는 스냅 샷을 제시 중간에 간다 :
class MainContainerViewController: UIViewController { @IBOutlet weak var containerView: UIView! let duration = 1.0 var presenting = true var originFrame = CGRect.zero var indexPathSelectedCell: IndexPath? var dismissCompletion: (()->())? func cycle(fromViewController: UIViewController, toViewController: UIViewController) { let folderViewC = (presenting ? fromViewController : toViewController) as! ViewController let projectViewC = (presenting ? toViewController : fromViewController) as! ProjectViewController let cellView = (presenting ? (folderViewC.folderCollectionView.cellForItem(at: folderViewC.folderCollectionView.indexPathsForSelectedItems!.first!) as! FolderCollectionViewCell).folderView : projectViewC.containerView)! let cellSnapshot = cellView.snapshotView(afterScreenUpdates: false)! let cellFrame = containerView.convert(cellView.frame, from: cellView.superview) cellSnapshot.frame = cellFrame cellView.isHidden = true toViewController.view.frame = self.containerView.frame toViewController.view.layoutIfNeeded() toViewController.view.alpha = 0 presenting ? (projectViewC.containerView.isHidden = true) : ((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.isHidden = true) fromViewController.willMove(toParentViewController: nil) self.addChildViewController(toViewController) self.containerView.addSubview(toViewController.view) self.containerView.addSubview(cellSnapshot) UIView.animate(withDuration: duration, animations: { toViewController.view.alpha = 1.0 let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview) cellSnapshot.frame = finalFrame }) { (_) in if !self.presenting { self.dismissCompletion?() } self.presenting ? (projectViewC.containerView.isHidden = false) : ((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.isHidden = false) cellSnapshot.removeFromSuperview() fromViewController.view.removeFromSuperview() fromViewController.removeFromParentViewController() toViewController.didMove(toParentViewController: nil) } } }
모든 코드가 잘못된 값으로
finalFrame
을 설정let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview)
제외하고는 제대로 작동합니다
여기 메인 뷰 컨트롤러 클래스의 코드 화면을 닫을 때 - 스냅 샷이 오른쪽 위치 근처로 이동하면 해제됩니다.
let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview)
라인은 이러한 방식으로 작동한다 :
- 체크가 최종 폴더의 프레임 값으로 일정하게 설정 제시하는 경우가
- 제시되면보기
- 해제 할 경우 프레임이 컬렉션의 슈퍼 뷰에서 선택한 컬렉션 뷰 셀의 folderView 값 여기
erView 전체 프로젝트입니다 : 당신이 projectViewController에 containerView의 크기에 맞게 자동 레이아웃을 사용하고 있기 때문에 https://github.com/ale00/OnteamAnon
죄송합니다. 언어로 실수를 저지른 경우 저는 이탈리아어입니다. – ale00