iOS 3D动画:旋转多个叠加视图时出现问题

问题描述 投票:0回答:1

问题

当在同一轴上同时翻转(例如pi旋转)视图时,视图层级(一个位于前面,哪一个位于后面)似乎受到干扰。

详细解释

在下面的GIF中,带有swift图标的灰色视图位于前面,蓝色视图位于后面。

您可以注意到,当灰色视图的第一次旋转达到pi / 2时,其透明度似乎会发生变化。此外,当灰色完成其第一次旋转时,而不是留在蓝色视图后面,它在所有下一次旋转期间看起来都在前面。

With blue coloured supView

现在重复完全相同的动画,蓝色视图现在没有应用颜色,但它仍然在灰色视图后面的视图层次结构中,并且仍然是动画的。

no colour view

期望的结果

我正在尝试实现相同的动画,将蓝色视图保持在灰色视图的顶部,而灰色视图上没有任何明显的透明度变化。我使用UIViewPropertyAnimator以后能够擦除动画。

代码

以下代码描述了动画所基于的简化翻转方法(作为UIView扩展)。

extension UIView{


    func flipping(_ times: Int = 1, to direction: FoldingDirection, within duration: Double = 0.01, startAfter delay: Double = 0) {
        guard times > 0 else { return }


        // resets the layer anchor point depending on the current transform states of the view (calling a specific method)
        self.setAnchorPoint(at: direction.anchor())

        // adding perspective effect 
        self.layer.transform.m34 = 1 / 250

        // setting rotation axis          
        let axis: CGPoint = {
            switch direction {
            case .right, .left:
                return CGPoint(x: 1, y: 0)
            default:
                return CGPoint(x: 0, y: 1)
            }
        }()

        let flipDuration = duration > 0 ? duration / Double(times) : 0.01

        // creating animator
        let animator = UIViewPropertyAnimator(duration: flipDuration, curve: .linear) {
            self.layer.transform = CATransform3DRotate(self.layer.transform, .pi, axis.y, axis.x, 0)
        }

        animator.startAnimation(afterDelay: delay)

        animator.addCompletion { (position) in
            if position == .end {
                self.flipping(times - 1, to: direction, within: duration * ( 1 - 1 / Double(times)), startAfter: 0)
            }   
        }
    }
}

调用动画:

greyView.flipping(3, to: .right, within: 9, startAfter: 0)
blueView.flipping(2, to: .right, within: 6, startAfter: 3)

谢谢你的帮助!

编辑在运行多个测试之后,似乎视图层次结构确实在动画期间发生了变化:旋转似乎发生在视图平面后面。

ios animation 3d rotation caanimation
1个回答
0
投票

在这种动画中,它们的Zpostion没有分配,因此您无法控制哪一个更接近而另一个更远。

在活动时将zPosition分配给图层将解决您的问题。你可以比较

      greyView.layer.zPosition = 20
       blueView.layer.zPosition = -20

         greyView.layer.zPosition = 200
       blueView.layer.zPosition = -200

你会知道我的意思。

© www.soinside.com 2019 - 2024. All rights reserved.