CAGradientLayer弄乱了CATransform3DRotate

时间:2018-01-14 11:31:52

标签: ios iphone swift core-animation

我正在CATransform3DRotate中观察到一个奇怪的行为,我将其应用于视图层,该视图位于图层前面的CAGradientLayer

当渐变视图出现时,变换动画类掩盖了我正在转换的视图的一半以及它前面的所有其他内容。如果渐变视图不存在或不在视图后面,一切都很好。

这里的屏幕截图显示了我的意思。您可以清楚地看到旋转视图是如何被部分隐藏的,以及下方的滑块也是如此。

normal state flipped left flipped right

由于看起来渐变层位于不同的z平面上,我玩了它的z位置,但这并没有帮助。此外,我仍然无法向我解释完全不相关的UISlider是如何被掩盖的。

我在这里做错了什么?

下面是一个完全独立的UIViewController,它说明了我的问题。

class TestViewController: UIViewController {
    private var gradientLayer: CAGradientLayer!
    private var flipContent: UILabel!
    private var flipView: UIView!
    private var gradientView: UIView!
    private var slider: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
        setupGradientLayer()
    }

    @IBAction func didChangeValue(_ sender: UISlider) {
        var perspectiveTransform = CATransform3DIdentity
        perspectiveTransform.m34 = -0.002
        let rotateAngle = CGFloat(sender.value) * CGFloat(Double.pi)
        let flipTransform = CATransform3DRotate(perspectiveTransform, rotateAngle, 0, 1, 0)
        flipView.layer.transform = flipTransform
    }

    private func setupGradientLayer() {
        gradientLayer = CAGradientLayer()
        gradientLayer.colors = [
            UIColor(red: 74 / 255, green: 173 / 255, blue: 255 / 255, alpha: 1.0).cgColor,
            UIColor(red: 0 / 255, green: 94 / 255, blue: 215 / 255, alpha: 1.0).cgColor
        ]
        gradientLayer.frame = view.bounds
        gradientView.layer.insertSublayer(gradientLayer, at: 0)
    }

    private func setupViews() {
        gradientView = UIView(frame: CGRect(x: 10, y: 150, width: 200, height: 30))
        slider = UISlider(frame: CGRect(x: 10, y: 400, width: 200, height: 30))
        slider.minimumValue = 0
        slider.maximumValue = 1
        slider.addTarget(self, action: #selector(didChangeValue(_:)), for: .valueChanged)
        flipView = UIView(frame: CGRect(x: 10, y: 100, width: 200, height: 200))
        flipView.backgroundColor = UIColor.lightGray
        flipContent = UILabel(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        flipContent.text = "I will flip"

        flipView.addSubview(flipContent)
        view.addSubview(gradientView)
        view.addSubview(flipView)
        view.addSubview(slider)
    }
}

1 个答案:

答案 0 :(得分:1)

在变换中添加z转换:

var perspectiveTransform = CATransform3DIdentity
perspectiveTransform.m34 = -0.002
let rotateAngle = CGFloat(sender.value) * CGFloat(Double.pi)
perspectiveTransform = CATransform3DTranslate(perspectiveTransform, 0, 0, 300)
flipView.layer.transform = CATransform3DRotate(perspectiveTransform, rotateAngle, 0, 1, 0)

如果您查看Debug View Hierarchy,您可以看到您的视图在同一个计划中。

您还可以设置zPosition(z翻译的简写形式):

flipView.layer.zPosition = 300