Ios 带有CAShapeLayer的UIView子类在设备旋转期间不设置动画

Ios 带有CAShapeLayer的UIView子类在设备旋转期间不设置动画,ios,uiview,core-animation,calayer,cashapelayer,Ios,Uiview,Core Animation,Calayer,Cashapelayer,TL;医生: 基本上,我的问题和你的一样 我(一如既往地)遵循罗布·马约夫(Rob Mayoff)的绝妙回答。我的问题是我使用的不是CAGradientLayer,而是CAShapeLayer,它不起作用 我使用CAShapeLayer而不是UIBezierPath,因为我需要设置路径颜色和阴影的动画 不过,问题在于设备旋转时路径的形状:CAShapeLayer的动画看起来很糟糕,事实上,它甚至没有动画,只是立即将路径排列到新边界 我曾将CAShapeLayer添加为子层,但在这里阅读一些答案时

TL;医生: 基本上,我的问题和你的一样

我(一如既往地)遵循罗布·马约夫(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()
这就是为什么您的图像在设备旋转时部分地重新绘制

你需要这样的东西:

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
    }

}

你能分享你的动画代码吗?嗨@VitaliyGozhenko没有动画代码:)我的意思是当设备旋转时,通过视图自动完成动画。我将添加一个类似问题的链接,以便您understand@J.Williams当前位置你找到解决你问题的办法了吗?在设备旋转时,我发现使用CAShapeLayer作为根层的自定义视图并不能解决在更改设备方向时调整视图大小的问题。