2009-10-14 6 views
25

J'ai souvent lu que l'utilisation d'un CALayer au lieu d'un UIImageView est un coup de pouce en termes de performances lorsqu'il s'agit d'une utilisation intensive d'images. Cela a du sens, car UIImageView provoque 3 copies de l'image en mémoire, ce qui est nécessaire pour l'animation de base. Mais dans mon cas, je n'utilise pas Core Animation.Afficher une image ou un UIImage avec un Calayer uni

Comment puis-je affecter un UIImage (ou ses données d'image) à un CALayer puis l'afficher?

+6

Où avez-vous lu ceci? UIViews en général sont des wrappers légers autour de CALayers, et je n'ai pas vu beaucoup de différence entre eux en ce qui concerne la mémoire ou les performances d'affichage. Je ne suis pas sûr si j'achète les 3 copies d'une image dans l'argument de mémoire. Dans tous les cas, CALayers font en effet partie de Core Animation (donc le préfixe CA). –

Répondre

54
UIImage* backgroundImage = [UIImage imageNamed:kBackName]; 
CALayer* aLayer = [CALayer layer]; 
CGFloat nativeWidth = CGImageGetWidth(backgroundImage.CGImage); 
CGFloat nativeHeight = CGImageGetHeight(backgroundImage.CGImage); 
CGRect  startFrame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight); 
aLayer.contents = (id)backgroundImage.CGImage; 
aLayer.frame = startFrame; 

ou dans une aire de jeux Swift (vous devrez fournir votre propre image PNG dans le fichier de ressources de l'aire de jeu. J'utilise l'exemple de "FrogAvatar".)

//: Playground - noun: a place where people can play 
import UIKit 

if let backgroundImage = UIImage(named: "FrogAvatar") // you will have to provide your own image in your playground's Resource file 
{ 
    let height = backgroundImage.size.height 
    let width = backgroundImage.size.width 

    let aLayer = CALayer() 
    let startFrame = CGRect(x: 0, y: 0, width: width, height: height) 

    let aView = UIView(frame: startFrame) 
    aLayer.frame = startFrame 
    aLayer.contentsScale = aView.contentScaleFactor 
    aLayer.contents = backgroundImage.cgImage 
    aView.layer.addSublayer(aLayer) 
    aView // look at this via the Playground's eye icon 
} 

An image as the content of a CALayer embedded in a UIView

+0

merci! pourquoi écrivez-vous (id) backgroundImage et pas simplement backgroundImage? Le compilateur ne devrait-il pas reconnaître que vous avez un UIImage? Ou la propriété CGImage n'est-elle pas reconnue autrement? Peut-être une importation manquante? –

+0

Je l'ai essayé. Le plus intéressant est cependant manquant: Comment l'obtenir à l'écran? Je veux éviter un UIViews autant que possible. –

+0

Vous devez ajouter CALayer en tant que sous-couche de la couche de certains UIView. Chaque couche n'a pas besoin de sa propre vue, mais la hiérarchie de couche doit résider quelque part dans une vue pour pouvoir être dessinée à l'écran. –

12

la version ARC a besoin d'un autre casting:

self.myView.layer.contents = (__bridge id) self.myImage.CGImage; 
0
CALayer *layer = [[CALayer alloc] init]; 
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"REWIFISocketOff"].CGImage); 
+0

Cette réponse serait considérablement améliorée si vous deviez inclure une explication plutôt que du code –