“魔法移动”效果自定义转场

Coc*_*uts 5 transition ios subviews autolayout

我试图在两个视图控制器之间进行自定义转换。首先,这是一张图片来说明我想要的:

我想要一个 UICollectionViewCell 扩展到整个屏幕。在此单元格中,子视图通过 IB 中的自动布局放置。

我只想让每个子视图转到新位置。所以我subview.frame = newSubview.frame在动画块中尝试过,但它不起作用(我认为是因为自动布局)。

我想在动画发生时删除约束,但它不起作用。

我还尝试对约束进行 @IBOutlets 并更改常量属性。

这是我的代码:

    let detailView = detailViewController.view
    let cellView = self.selectedCell

    container.addSubview(cellView!)

    let duration = self.transitionDuration(transitionContext)

    UIView.animateWithDuration(duration, delay: 0.0, options: .CurveEaseInOut, animations: {

            let newFrame = detailViewController.view.frame
            cellView!.frame = newFrame
            cellView!.imageView.frame = newFrame
            cellView!.labelTopConstraint.constant = 27
            cellView!.labelRightConstraint.constant = 8
            cellView!.layoutIfNeeded()
        }

...
Run Code Online (Sandbox Code Playgroud)

实际上,当动画开始时,标签捕捉到一个位置,然后它们移动,最后它们不在正确的位置......

有任何想法吗 ?谢谢

Kyl*_*lol 1

查看此存储库,我认为这就是您正在寻找的 BCMagicTransition: https: //github.com/boycechang/BCMagicTransition

您的代码的问题是,您没有将要设置动画的集合视图单元格的子视图的帧转换为过渡的容器视图控制器的坐标,并且与其位置的最终帧相同。即使您使用自动布局,您仍然可以使用视图的框架来操作视图。

要实现此目的,请查看此方法(文档):

        func convertRect(rect: CGRect, fromView view: UIView?) -> CGRect
Run Code Online (Sandbox Code Playgroud)

您还应该研究您想要动画的视图的动画快照。然后只需将快照添加到容器视图中,并将它们设置为转换后的最终帧的动画,然后在动画完成时将其删除。

希望这可以帮助 !