2016-08-18 2 views
2

Я хочу сделать анимацию, как папку с исходным экраном iOS. У меня есть Container View в Main View Controller и в Container View. Я переключаюсь между двумя контроллерами View с анимацией.
Вот код главного View Controller Класс:Неверные значения кадров во время анимации

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) 

     } 

    } 

} 

Весь код работает правильно, за исключением 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), которые устанавливают 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) линия работает таким образом:

  • проверить, если он представляет
  • , если он представляет установить константу в кадра стоимости конечной папки вид
  • , если он отклоняет преобразование frame значение папкиПросмотр выбранной коллекции View Cell из супервизора этой складкой erView

Вот весь проект: https://github.com/ale00/OnteamAnon

+0

Извините, если я допустил некоторые ошибки с этим языком, я итальянский – ale00

ответ

2

Поскольку вы используете автоматическую раскладку для размера вашего containerView в projectViewController, вам нужно позвонить layoutIfNeeded() на self.containerView после этой части кода:

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

Смежные вопросы