gpt4 book ai didi

ios - 自定义 CALayer 动画

转载 作者:行者123 更新时间:2023-12-01 19:53:25 25 4
gpt4 key购买 nike

我有一个 UIView,它有一个为我做所有绘图的图层。因此,现在当我更改 View 的值时,它会将其转发到图层。当我在 UIView-Animaiton block 中时,我希望该更改具有动画效果。

所以我目前在做什么:

class SampleView: UIView {
var myProperty: CGFloat {
set {
sampleLayer.myProperty = newValue
}
get {
return sampleLayer.myProperty
}
}

override class var layerClass: AnyClass {
return SampleViewLayer.self
}

private var sampleLayer: SampleViewLayer {
return layer as! SampleViewLayer
}
}

class SampleViewLayer: CALayer {
@NSManaged public var myProperty: CGFloat

override func draw(in ctx: CGContext) {
// Incredible beautiful drawing is happening here depending on myProperty
}

override static func needsDisplay(forKey key: String) -> Bool {
if key == "myProperty" {
return true
}
return super.needsDisplay(forKey: key)
}

override func action(forKey event: String) -> CAAction? {

if event == "myProperty" {

// 1. How do I find out if the change should be animated?

let animation = CABasicAnimation(keyPath: event)
animation.fromValue = presentation()?.value(forKey: event)

// 2. How do I find out the proper timingFunction as well as the proper duration?
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
animation.duration = 1.0

return animation
}

return super.action(forKey: event)
}
}

我希望能够像这样对其进行动画处理:
....
instanceOfMySampleView.myProperty = 0 // inital value should be set without animation
UIView.animate(withDuration: 4, animations: {
self.instanceOfMySampleView.myProperty = 10 // should animate to this value
})
....

所以这两个实际问题在我的示例代码中......
1. 我如何确定更改是否应该被动画化?那么如何弄清楚它发生在 UIView-Animation-Block 内部呢?
  • 如果它是动画的,如何找到持续时间和时间函数的正确参数?

  • 还。如果我在代码中创建我的 View 实例,将其 myProperty 值设置为初始值,然后直接执行 UIViewAnimationBlock,PresentationLayer 将为 nil,因此我的动画将无法正常工作......

    最佳答案

    除非自从我上次调查以来进行了一些更改,否则我会说您无法获得这些值。可惜没有为它提供API。

    如果您对动画 View 的调用是手动的(您正在调用这些动画),那么我建议您将所有这些调用替换为一些自定义调用。点赞AnimationManager.animate(withDuration:...然后此方法调用 UIView相应的方法,因此您需要用这些替换所有调用。完成后,您应该会看到与当前相同的结果。

    现在您需要在此代码中添加逻辑以保存曲线的值、持续时间......一个基本的实现是在动画 block 开始时保存新值,然后在结束时将其删除(不是在完成时而是在最后一行在动画 block 中)。

    一个更复杂的系统是创建一个设置堆栈(数组应该做)而不是单个值。开始时您添加一个对象,最后您只需将其删除。这样做的原因是动画调用可能是嵌套的,仅仅删除动画设置可能还不够。第二个原因是您可能还需要添加功能 performWithoutAnimations这也在 UIView ,在这种情况下,您只需将一个空对象附加到堆栈。

    在这两种情况中的任何一种情况下,您都可能得到 AnimationManager.isAnimating , AnimationManager.animationDuration , AnimationManager.animationCurve ...因此,这可以从您自己对动画的调用中很好地工作。但是要使其通用(例如在设备方向更改时)似乎是一个很大的问题。我很确定这些数据一定在某个地方,并且很乐意访问它们。

    除非您找到更合适的解决方案,否则我希望此系统对您有所帮助。

    关于ios - 自定义 CALayer 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44198047/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com