CAGradientLayer
을 상상해보십시오.단순히 다른 속성을 변경하는 레이어 속성에 애니메이션을 적용 하시겠습니까?
.startPoint
및 .endPoint
을 애니메이션으로 만드는 것은 매우 쉽습니다.
이제 float spinLike
을 간단히 으로 설정하면이됩니다.
{대신 두 개의 서로 다른 애니메이션을 필요없이 그래서, 당신은 단순히 spinLike
애니메이션을 수 있습니다.} 그래서
뭔가 같은 ..
class CustomGradientLayer: CAGradientLayer {
@objc var spinLike: CGFloat = 0 {
didSet {
startPoint = CGPoint(...)
endPoint = CGPoint(...)
setNeedsDisplay()
}
}
}
이 spinLike
애니메이션 ...
class Test: UIView {
...
g = CustomGradientLayer()
a = CABasicAnimation(keyPath: "spinLike")
...
g.add(a, forKey: nil)
...
그러나.
작동하지 않습니다. startPoint
및 endPoint
은 전혀 이동되지 않습니다.
무엇이 잘못 되었나요?
주 - 비극적 인 것 같습니다 당신이 할 수없는 @NSManaged
didSet이있는 건물 ...
주 - 당신의 자신의 사용자 지정 애니메이션을 만들 정도로 쉽게은 무승부 루프을 무시합니다.
많은 예가 있습니다. 이것은 당신이 그것을 할 방법 :
class CircleProgressLayer: CALayer {
@NSManaged var progress: CGFloat
override class func needsDisplayForKey(key: String) -> Bool {
if key == "progress" {
return true
}
return super.needsDisplayForKey(key)
}
override func draw(in ctx: CGContext) {
path.fill() etc etc... your usual drawing code
}
}
불행하게도 내 여기에 질문 실제 도면
관련이 : 재산 spinLike
애니메이션으로
, 단순히 기존의 각 프레임을 변경하려면
일반 애니메이션 속성 (이 예제에서는 .startPoint
및 .endPoint
)
어떻게합니까?
참고! 당신은 drawInContext
에서 .startPoint
및 .endPoint
을 변경할 수 없습니다 - 당신이 attempting to modify read-only layer
당신은 (문맥 : CGContext) 그릴'덮어 쓰기한다 :'가 아니라'drawInContext (CTX : CGContext)'
이
은 레이어 클래스의 코드입니다. – clemens(흠, 그게 @clemens가 아니예요. 저는 실제로'draw # in'을 테스트 했었습니다. 저는 방금 이전 습관을 입력했습니다 ... :) – Fattie
문제에 대해 진전을 보았습니까? 'startPoint'와'endPoint'가 항상 'spinLike'와 관련이 있다면,이 속성들을 드롭하고 그 값을'draw (in :)'로 계산할 수 있습니다. – clemens