2011-02-18 2 views
0

Je voudrais ajouter l'ombre à un UIImageView qui a des couches d'image.(iphone) ajouter une ombre à la couche

J'ai essayé la route self.layer.shadowOffset/de shadowOpacity, mais il est trop lent ..
Quand je veux ajouter une ombre, j'appeler la méthode ci-dessous addShadowLayerWithOffset que je comptais appeler drawRect et ajouter l'ombre ..
Mais drawRect n'est pas appelé.

Qu'est-ce qui me manque ici?

- (void)drawRect:(CGRect)rect 
{ 
    SYSLOG(LOG_DEBUG, "in drawRect, isShadowed: %d", isShadowed); 
    if (isShadowed == true) 
    { 
     CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
     CGContextSaveGState(currentContext); 
     CGContextSetShadow(currentContext, CGSizeMake(100, 100), 3); 
     [super drawRect: rect]; 
     CGContextRestoreGState(currentContext); 
    } 
    else 
     [super drawRect: rect]; 
} 

- (void) addShadowLayerWithOffset: (int)offset 
{ 
// self.layer.shadowOffset = CGSizeMake(offset,offset);                                                      
// self.layer.shadowOpacity = 0.7f;                                                           
// self.layer.shadowRadius = 5.0;                                                            
    isShadowed = true; 
    [self setNeedsDisplay]; 
} 
  • EDIT

ok, je me suis drawLayer appelée. J'avais besoin de [self.layer setNeedsDisplay] et non de [self.layer setNeedsPlay] où self est la sous-classe UIImageView.

Mais l'ombre n'est pas dessinée, en effet l'image (couche d'origine) elle-même n'est pas affichée non plus.
Que devrais-je changer?

- (void) drawLayer: (CALayer*) layer inContext: (CGContextRef)context 
{ 
    SYSLOG(LOG_DEBUG, "in drawLayer, isShadowed: %d", isShadowed); 
    if(isShadowed == true) 
    { 
     CGContextSaveGState(context); 
     CGContextSetShadow(context, CGSizeMake(10, 10), 3); 
     [super drawLayer: layer inContext: context]; 
     CGContextRestoreGState(context); 
    } 
    else 
     [super drawLayer: layer inContext: context]; 
} 

Répondre

1

vous appelez:

[super drawRect: rect]; 

mais dit pomme:

Vous ne devriez jamais appeler cette méthode vous directement. Pour invalider une partie de votre vue, et ainsi rendre cette partie à redessiner, appelez la méthode setNeedsDisplay ou setNeedsDisplayInRect: à la place.

au lieu de drawRect, avez-vous déjà essayé drawLayer?

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
+0

Je suppose que [super drawRect: rect] est correct car [super dealloc] est correct. Quoi qu'il en soit, drawLayer n'est pas appelé non plus. J'ai défini le délégué des couches que j'ai ajouté à la vue. – eugene

+0

Merci d'avoir appelé drawLayer, mais l'image n'est pas en cours de dessin, voir mon édition s'il vous plaît – eugene

+0

@Eugene: ops, désolé, vous avez raison, je n'ai pas vu que c'était dans une méthode drawRect ... je donne un regarde ton montage maintenant ... – meronix

2

essayer d'appeler cette méthode:

appelé par un UIViewController:

[self addShadowedLayer:self.view inRect:(CGRectMake(30, 30, 128, 192))]; 


- (void)addShadowedLayer:(UIView *)aUIView inRect:(CGRect)aRect { 
    CALayer *sublayer = [CALayer layer]; 
    sublayer.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor; 
    sublayer.shadowOffset = CGSizeMake(0, 3); 
    sublayer.shadowRadius = 5.0; 
    sublayer.shadowColor = [UIColor blackColor].CGColor; 
    sublayer.shadowOpacity = 0.8; 
    sublayer.frame = aRect; 
    sublayer.cornerRadius = 26.0; 
    [aUIView.layer addSublayer:sublayer]; 
} 

il suffit d'ajouter un rectangle arrondi blanc, mais ce que vous avez besoin est juste son ombre ...

1

Je pense que vous aboyer le mauvais arbre. Vous avez dit que spécifier l'ombre directement sur la couche d'image est trop lent. C'est correct parce que le système d'exploitation utilise le canal alpha pour déterminer où dessiner l'ombre.

Ce que vous pouvez faire pour améliorer les performances de rendu sur iOS 3.2 et versions ultérieures, c'est que vous spécifiez un chemin d'accès miroir. Vous créez d'abord un CGPathRef et le définissez comme chemin d'accès miroir de la couche.

Cela devrait améliorer le rendu de façon spectaculaire sans avoir à présenter une autre couche juste pour l'ombre.

Questions connexes