Hãy tưởng tượng một số CAGradientLayer
.Tạo hiệu ứng một thuộc tính lớp đơn giản là thay đổi các thuộc tính khác?
Rất dễ dàng để tạo ảnh động .startPoint
và .endPoint
.
Bây giờ hãy tưởng tượng một phao spinLike
đơn giản là đặt cả hai số cùng một lúc.
{Vì vậy, thay vì có hai hình ảnh động khác nhau, bạn có thể chỉ đơn giản là động spinLike
.}
Vì vậy, một cái gì đó giống như ..
class CustomGradientLayer: CAGradientLayer {
@objc var spinLike: CGFloat = 0 {
didSet {
startPoint = CGPoint(...)
endPoint = CGPoint(...)
setNeedsDisplay()
}
}
}
Để động spinLike
...
class Test: UIView {
...
g = CustomGradientLayer()
a = CABasicAnimation(keyPath: "spinLike")
...
g.add(a, forKey: nil)
...
Nhưng.
Nó không hoạt động, startPoint
và endPoint
hoàn toàn không được di chuyển.
Điều gì là sai?
Note - bi thảm có vẻ như bạn không thể @NSManaged
một tài sản trong đó có một didSet ...
Lưu ý - nó đủ dễ dàng để làm của riêng hoạt hình tùy chỉnh của bạn chỉ bằng ghi đè vòng lặp vẽ.
Có nhiều ví dụ về điều này xung quanh. Đây là cách bạn làm điều đó:
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
}
}
Đáng tiếc là câu hỏi của tôi ở đây là
Không liên quan đến bản vẽ thực tế:
Bằng cách hoạt ảnh tài sản spinLike
,
tôi chỉ đơn giản muốn thay đổi mỗi frame hiện các thuộc tính có thể hoạt hình thông thường (trong ví dụ, .startPoint
và .endPoint
)
Làm thế nào để bạn làm điều này?
Lưu ý! Bạn không thể thay đổi .startPoint
và .endPoint
trong drawInContext
- bạn muốn được attempting to modify read-only layer
Bạn nên ghi đè 'vẽ (trong ngữ cảnh: CGContext) 'và không' drawInContext (ctx: CGContext)'. – clemens
(Hmm, đó không phải là @clemens - Tôi đã làm trong thực tế kiểm tra 'vẽ # in' - Tôi chỉ cần gõ cũ ra khỏi thói quen ... :)) – Fattie
Bạn đã thực hiện bất kỳ tiến bộ về vấn đề của bạn? Nếu 'startPoint' và' endPoint' luôn liên quan đến 'spinLike', bạn có thể thả các thuộc tính này và tính các giá trị của chúng trong' draw (in:) '. – clemens