TL; DR: По сути, моя проблема такая же, как у этот вопрос.
Я последовал отличному ответу (как всегда) Роба Мэйоффа. Моя проблема в том, что я использую не 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
ужасна.
Я что-то упускаю?
Всем большое спасибо.