2016-08-18 2 views
2

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

+0

죄송합니다. 언어로 실수를 저지른 경우 저는 이탈리아어입니다. – ale00

답변

2

, 당신은 당신의 코드의이 부분 이후 self.containerViewlayoutIfNeeded()를 호출해야합니다

self.addChildViewController(toViewController) 
self.containerView.addSubview(toViewController.view) 
self.containerView.addSubview(cellSnapshot) 

는 그래서됩니다 :

self.addChildViewController(toViewController) 
self.containerView.addSubview(toViewController.view) 
self.containerView.addSubview(cellSnapshot) 
self.containerView.layoutIfNeeded()  
+0

고마워요, 지금 작동합니다! 이게 문제라고 생각했지만 테스트를 안 했어. – ale00

관련 문제