"Magic Move"效果自定义转场

5
我想要在两个视图控制器之间实现自定义转场效果。首先,这里有一张图片来说明我的需求: 我希望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()
        }

...

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

有什么想法吗?谢谢


你找到了解决问题的好方法了吗? - mikrobi
1个回答

1

请查看这个仓库,我认为这就是你正在寻找的BCMagicTransition:https://github.com/boycechang/BCMagicTransition

你的代码问题在于你没有将要动画的集合视图单元格子视图的帧转换为过渡的容器视图控制器的坐标,同样也适用于它们位置的最终帧。即使你使用自动布局,你仍然可以通过它们的框架来操作视图。

为了实现这一点,请查看这个方法(documentation):

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

你还应该考虑动画快照视图,然后将快照添加到容器视图中,将它们动画到转换后的最终帧,完成动画后再将其移除。
希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接