CAGradientLayer混淆了CATransform3DRotate

我正在观察CATransform3DRotate一个奇怪行为,我正将它应用于视图的图层,该图层的图层具有CAGradientLayer

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

这里有截图来展示我的意思。 您可以清楚地看到旋转后的视图是如何隐藏的,以及下面的滑块。

向左翻转向右翻转

由于它看起来像渐变图层在不同的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)
    }
}

将az转换添加到您的转换中:

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
链接地址: http://www.djcxy.com/p/12883.html

上一篇: CAGradientLayer messes up CATransform3DRotate

下一篇: Rotating a CAShapeLayer arc about its center using CABasicAnimation