“魔术移动”效果定制过渡

时间:2014-12-04 19:35:13

标签: ios autolayout transition subviews

我尝试在两个View Controller之间进行自定义转换。首先,这是一张图片来说明我的想法:

我希望UICollectionViewCell扩展到整个屏幕。在此单元格中,子视图与IB中的Autolayout一起放置。

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

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

我还试图制作约束的@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()
        }

...

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

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:1)

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

您的代码存在的问题是,您没有将要设置动画的集合视图单元的子视图的帧转换为转换的容器视图控制器的坐标,并且与最终帧的转换相同他们的立场。即使您使用的是AutoLayout,您仍然可以使用其框架来操纵视图。

要完成此操作,请检查此方法(documentation):

        func convertRect(rect: CGRect, fromView view: UIView?) -> CGRect

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

希望这有帮助!