4

On iPhone I have a CALayer that I animate via Core Animation. Then at some point I change view controllers. I then return to the view controller with the CALayer and in viewWillAppear: I set the frame and position properties on my layer to move it back to its starting point.

Setting these properties changes the model layer but the presentation layer still has the old values and its presentation layer does not update until the next animation I play.

In the CA Programming guide it says :

"You can query an instance of CALayer for its corresponding presentation layer while an animation transaction is in process."

Which, to me, implies that the presentation layer should only be different from the model layer during an animation. But there are no animations currently running. I even used kCATransactionDisableActions to ensure that when I set the position property an implicit animation is not started.

Does anyone know why my presentation and model layers are out of sync?

Thanks.

Mutix
  • 4,196
  • 1
  • 27
  • 39

2 Answers2

1

It sounds like Apple just uses the Presentation Layer during animations, and has lazy updates to it. When it's not animating, it must use the normal layer. My only bet is this is how they manage to thread the UI and avoid weird errors. It may even be related to which threads are used.

Your problem gives us insight into Apple's hood, perhaps the answer is simply that is what apple is choosing, and it answers a question I had, too.

Stephen J
  • 2,367
  • 2
  • 25
  • 31
1

One workaround I've used is to reset the position of my layers in viewWillDisappear. Also I noticed that if I don't animate my layer right away then it does indeed move to the position that I set in viewWillAppear.

  • 2
    The general problem is that if I set the position after an animation it only affects the model layer. Is there some way to force the presentation layer to "catch up to the model layer? – Kevin McCullough Apr 05 '10 at 18:40
  • Old question, but here is the solution that works for me (at least on iOS 15, since it seems to me that some Apple-guy messes up this area in every year). In the layer, after the animation finished, call this: setValue(targetValue, forKeyPath: keyPath) BOTH on the model and the presentation layer. – jason d Jan 08 '22 at 01:54