CATransaction
What the flush ?!
Amadour Griffais
CocoaHeads Paris
9 janvier 2014
Core Animation
• crée et manipule des objets graphiques
• les affiche
• les anime
Core Animation
Core Animation
Core Animation
Core Animation
Core Animation
Model
Ab

CALayer
CAAnimation
Core Animation
Model
Ab

Render server

CALayer
CAAnimation

C++
Core Animation
Model
Ab

Render server

CALayer
CAAnimation

C++
Core Animation
Model
Ab

CALayer
CAAnimation
Core Animation
Model
Ab

CALayer
CAAnimation
CATransaction
Core Animation Programming Guide
Explicit Transactions Let You Change Animation Parameters
[CATransaction
[C...
CATransaction
Model
Ab
CATransaction
Model
0.5s

Ab
CATransaction
Core Animation Programming Guide
Explicit Transactions Let You Change Animation Parameters
[CATransaction
[C...
CATransaction
Model
Ab
CATransaction
Model
Ab
CATransaction Class Reference
CATransaction Class Reference
Model

Render server
Model
Ab

Render server
[CATransaction flush];
Model
Ab

Render server
[CATransaction flush];
Model
Ab

Render server
Ab
[CATransaction flush];
• Commit de la transaction implicite
• Englobe toutes les transaction explicites
• Envoie les modific...
[CATransaction flush];
• A chaque tour de runloop
• Provoque layout si nécessaire
[CATransaction flush];
• A chaque tour de runloop
• Provoque layout si nécessaire
• Provoque display si nécessaire
[CATransaction flush];
• Equivalent à [CATransaction commit];
• Attend la fin des transaction explicites
• Définit le beginTi...
[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
CAAnimation* anim = [CABasicAnimation animationWithKeyPat...
En pratique
Déclencher une animation d’attente avant de
bloquer le main thread
[activityIndicator startAnimating];
[self d...
En pratique
Déclencher une animation d’attente avant de
bloquer le main thread
[activityIndicator startAnimating];
[CATran...
En pratique
Appliquer des animations implicites à des
layers qui viennent d’être ajoutés
CALayer* layer = [CALayer layer];...
En pratique
Appliquer des animations implicites à des
layers qui viennent d’être ajoutés
CALayer* layer = [CALayer layer];...
En pratique
Faire un rendu dans un contexte en
background et nettoyer derrière soi
CALayer* layer = ...;
dispatch_async(di...
En pratique
Faire un rendu dans un contexte en
background et nettoyer derrière soi
CALayer* layer = ...;
dispatch_async(di...
En pratique ?
Faire un rendu dans un contexte en
background et nettoyer derrière soi
CALayer* layer = ...;
dispatch_async(...
Questions ?
• Ressources
• WWDC videos
• Core Animation Programming Guide
@amadour
CocoaHeads Paris - Amadour Griffais - CATransaction: What the flush?!
CocoaHeads Paris - Amadour Griffais - CATransaction: What the flush?!
Upcoming SlideShare
Loading in …5
×

CocoaHeads Paris - Amadour Griffais - CATransaction: What the flush?!

3,952 views
3,746 views

Published on

Slides of the short talk I gave at the January 2014 session of CocoaHeads Paris.
On Core Animation and CATransaction.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,952
On SlideShare
0
From Embeds
0
Number of Embeds
2,654
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

CocoaHeads Paris - Amadour Griffais - CATransaction: What the flush?!

  1. 1. CATransaction What the flush ?! Amadour Griffais CocoaHeads Paris 9 janvier 2014
  2. 2. Core Animation • crée et manipule des objets graphiques • les affiche • les anime
  3. 3. Core Animation
  4. 4. Core Animation
  5. 5. Core Animation
  6. 6. Core Animation
  7. 7. Core Animation Model Ab CALayer CAAnimation
  8. 8. Core Animation Model Ab Render server CALayer CAAnimation C++
  9. 9. Core Animation Model Ab Render server CALayer CAAnimation C++
  10. 10. Core Animation Model Ab CALayer CAAnimation
  11. 11. Core Animation Model Ab CALayer CAAnimation
  12. 12. CATransaction Core Animation Programming Guide Explicit Transactions Let You Change Animation Parameters [CATransaction [CATransaction layer.position [CATransaction begin]; setAnimationDuration:0.5]; = CGPoint(100,100); commit];
  13. 13. CATransaction Model Ab
  14. 14. CATransaction Model 0.5s Ab
  15. 15. CATransaction Core Animation Programming Guide Explicit Transactions Let You Change Animation Parameters [CATransaction [CATransaction layer.position [CATransaction begin]; setAnimationDuration:0.5]; = CGPoint(100,100); commit]; Disable Actions Temporarily Using the CATransaction Class [CATransaction [CATransaction layer.position [CATransaction begin]; setDisableActions:YES]; = CGPoint(100,100); commit];
  16. 16. CATransaction Model Ab
  17. 17. CATransaction Model Ab
  18. 18. CATransaction Class Reference
  19. 19. CATransaction Class Reference
  20. 20. Model Render server
  21. 21. Model Ab Render server
  22. 22. [CATransaction flush]; Model Ab Render server
  23. 23. [CATransaction flush]; Model Ab Render server Ab
  24. 24. [CATransaction flush]; • Commit de la transaction implicite • Englobe toutes les transaction explicites • Envoie les modifications au render server
  25. 25. [CATransaction flush]; • A chaque tour de runloop • Provoque layout si nécessaire
  26. 26. [CATransaction flush]; • A chaque tour de runloop • Provoque layout si nécessaire • Provoque display si nécessaire
  27. 27. [CATransaction flush]; • Equivalent à [CATransaction commit]; • Attend la fin des transaction explicites • Définit le beginTime des animations !
  28. 28. [CATransaction begin]; [CATransaction setAnimationDuration:0.5]; CAAnimation* anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; [layer addAnimation:anim forKey:@"opacity"]; //<CABasicAnimation:0xc028980; duration = 0.5; keyPath = opacity> [CATransaction commit]; //<CABasicAnimation:0xc028980; duration = 0.5; keyPath = opacity> [CATransaction flush]; //<CABasicAnimation:0xc028980; beginTimeMode = absolute; // beginTime = 11797.4; duration = 0.5; keyPath = opacity>
  29. 29. En pratique Déclencher une animation d’attente avant de bloquer le main thread [activityIndicator startAnimating]; [self doReallyLongStuff];
  30. 30. En pratique Déclencher une animation d’attente avant de bloquer le main thread [activityIndicator startAnimating]; [CATransaction flush]; [self doReallyLongStuff];
  31. 31. En pratique Appliquer des animations implicites à des layers qui viennent d’être ajoutés CALayer* layer = [CALayer layer]; layer.frame = CGRectMake(0, 0, 200, 200); layer.backgroundColor = [[UIColor redColor] CGColor]; [self.view.layer addSublayer:layer]; layer.frame = CGRectMake(100, 100, 200, 200);
  32. 32. En pratique Appliquer des animations implicites à des layers qui viennent d’être ajoutés CALayer* layer = [CALayer layer]; layer.frame = CGRectMake(0, 0, 200, 200); layer.backgroundColor = [[UIColor redColor] CGColor]; [self.view.layer addSublayer:layer]; [CATransaction flush]; layer.frame = CGRectMake(100, 100, 200, 200);
  33. 33. En pratique Faire un rendu dans un contexte en background et nettoyer derrière soi CALayer* layer = ...; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ UIGraphicsBeginImageContext(layer.bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); [layer renderInContext:context]; UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); dispatch_sync(dispatch_get_main_queue(), ^{ [self useImage:image]; }); });
  34. 34. En pratique Faire un rendu dans un contexte en background et nettoyer derrière soi CALayer* layer = ...; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ UIGraphicsBeginImageContext(layer.bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); [layer renderInContext:context]; [CATransaction flush]; UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); dispatch_sync(dispatch_get_main_queue(), ^{ [self useImage:image]; }); });
  35. 35. En pratique ? Faire un rendu dans un contexte en background et nettoyer derrière soi CALayer* layer = ...; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ [CATransaction lock]; UIGraphicsBeginImageContext(layer.bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); [layer renderInContext:context]; [CATransaction unlock]; [CATransaction flush]; UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); dispatch_sync(dispatch_get_main_queue(), ^{ [self useImage:image]; }); });
  36. 36. Questions ? • Ressources • WWDC videos • Core Animation Programming Guide @amadour

×