在扩展的CollectionViewCell旁边对蒙版进行动画处理

时间:2019-07-25 20:43:19

标签: swift animation

我正在进行一个过渡,在此过渡期间collectionView单元会展开以显示新元素。

为了防止新元素随单元动画,我从动画视图中将它们删除。

Here is an image of the view hierarchy

从动画视图中删除元素后,它们也不再被单元格裁剪,而是在单元格扩展之前就显示出来。

现在,我可以在为单元设置动画的元素或应该出现的元素之间进行选择。

Here is a video of the current state of the animation

您可以看到新元素出现在所选元素左侧的单元格中。

以下是我动画过渡的代码:

    let destination = transitionContext.viewController(forKey: .to) 
    let containerView = transitionContext.containerView

    containerView.addSubview(destination.view)


    // Initial state


    let widthConstraint = destination.header.widthAnchor.constraint(equalToConstant: 500)

    let heightConstraint =  destination.header.heightAnchor.constraint(equalToConstant: 601)

    NSLayoutConstraint.activate([widthConstraint, heightConstraint])

    let transform = CATransform3DMakeTranslation(cellFrame.origin.x, cellFrame.origin.y, 0.0)


    destination.topView.layer.transform = transform
    destination.view.layer.zPosition = 999

    containerView.layoutIfNeeded()


    let animator = UIViewPropertyAnimator(duration: 4, dampingRatio: 10) {

        // Final state

        NSLayoutConstraint.deactivate([widthConstraint, heightConstraint])
        destination.topView.layer.transform = CATransform3DIdentity

        destination.view.layoutIfNeeded()
    }

我当时正在考虑根据扩展单元的框架来掩盖新元素,但不确定如何使它起作用。

2 个答案:

答案 0 :(得分:0)

您可以执行的另一种解决方案是将labelingView转换为仅在应显示的时候显示。例如,仅在完成动画过渡后才显示labelingView。

一些伪代码。

 labelingView.alpha = 0
 UIView.animate(withDuration: 1, animations: {
    // perform transitions
 }) { _ in
    labelingView.alpha = 1
 }

答案 1 :(得分:0)

我解决了它,事实证明它比预期的要容易。

我只是基于初始collectionViewCell创建了一个蒙版,然后将其动画化并与扩展单元格一起全屏显示。

let mask = UIView()
        mask.frame.origin = CGPoint(x: cellFrame.origin.x, y: cellFrame.origin.y)
        mask.frame.size = CGSize(width: 500, height: 601)
        mask.backgroundColor = .white
        mask.alpha = 1
        destination.labelingView.mask = mask


// Final mask state
            mask.frame.origin = CGPoint(x: 0.0, y: 0.0)
            mask.frame.size = CGSize(width: 1366, height: 1024)