TL; DR:
基本上我的问题与这个问题相同:CAGradientLayer, not resizing nicely, tearing on rotation. (video of issue attached)

我一如既往地遵循Rob Mayoff的出色回答。我的问题是我没有使用CAGradientLayer,而是使用了 CAShapeLayer ,它不起作用

我使用CAShapeLayer而不是UIBezierPath,因为我需要为路径的颜色和阴影设置动画。

但是,问题与设备旋转时的路径形状有关:CAShapeLayer的动画看起来很糟糕,实际上甚至没有动画,它只是立即将路径布置到新的边界。

我曾经将CAShapeLayer添加为子层,但是在这里阅读一些答案时,我尝试将UIView子类化,并将其层设置为CAShapeLayer,以便视图可以自动管理旋转动画,但是结果是相同的。

如果我使用UIBezierPath进行绘制,它确实可以很好地工作(但是很遗憾,我需要CAShapeLayer功能)

这是我的代码:

import UIKit

class CaShapeLayerView: UIView {

    override class func layerClass () -> AnyClass{
        return CAShapeLayer.self
    }

    override func drawRect(rect: CGRect) {

        var bezierPath = UIBezierPath()

        // create a random scribble :)
        bezierPath.moveToPoint(CGPoint(x: 0, y: 0))
        bezierPath.addCurveToPoint(CGPoint(x:self.bounds.width, y:self.bounds.height), controlPoint1: CGPoint(x: self.bounds.width/50, y: self.bounds.height/2), controlPoint2: CGPoint(x: self.bounds.width/40, y: self.bounds.height/8*10))

        // draw UIBezierPath
        UIColor.redColor().set()
        bezierPath.lineWidth = 20
        bezierPath.stroke()

        // draw CAShapeLayer
        var shapeLayer = self.layer as CAShapeLayer

        shapeLayer.strokeColor = UIColor.blueColor().CGColor
        shapeLayer.fillColor = nil
        shapeLayer.lineWidth = 16
        shapeLayer.path = bezierPath.CGPath

    }
}

旋转设备,您将看到红色的UIBezierPath和蓝色的CAShapeLayer之间的区别。
我以实际路径向我保证,CAShapeLayer的“动画”非常糟糕。

我想念什么吗?

非常感谢大家。

最佳答案

您的drawRect上的此代码无法设置动画:

        UIColor.redColor().set()
        bezierPath.lineWidth = 20
        bezierPath.stroke()

这就是为什么图像partially在设备旋转时重新绘制

您需要这样的东西:
class CAShapeLayerView: UIView {
    var firstShapeLayer, secondShapeLayer:CAShapeLayer
    required init(coder aDecoder: NSCoder) {
        firstShapeLayer = CAShapeLayer()
        secondShapeLayer = CAShapeLayer()
        super.init(coder: aDecoder)
    }

    override class func layerClass () -> AnyClass{
        return CAShapeLayer.self
    }

    override func awakeFromNib() {
        self.firstShapeLayer.lineWidth = 20
        self.firstShapeLayer.strokeColor = UIColor.redColor().CGColor
        self.firstShapeLayer.fillColor = nil

        self.secondShapeLayer.strokeColor = UIColor.blueColor().CGColor
        self.secondShapeLayer.fillColor = nil
        self.secondShapeLayer.lineWidth = 16
        self.layer.addSublayer(self.firstShapeLayer)
        self.layer.addSublayer(self.secondShapeLayer)
    }

    override func layoutSubviews() {
        super.layoutSubviews();
        var bezierPath = UIBezierPath()

        // create a random scribble :)
        bezierPath.moveToPoint(CGPoint(x: 0, y: 0))
        bezierPath.addCurveToPoint(CGPoint(x:self.bounds.width, y:self.bounds.height), controlPoint1: CGPoint(x: self.bounds.width/50, y: self.bounds.height/2), controlPoint2: CGPoint(x: self.bounds.width/40, y: self.bounds.height/8*10))

        self.firstShapeLayer.path = bezierPath.CGPath
        self.secondShapeLayer.path = bezierPath.CGPath
    }

}

关于ios - 在设备旋转期间,用CAShapeLayer子类化的UIWiew无法动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27999611/

10-14 23:28