2009-08-04 7 views
1

Donc, en utilisant ce lien: How do I draw a shadow under a UIView?UIView arrondi avec ombre?

Et ce lien: http://iphonedevelopment.blogspot.com/2008/11/creating-transparent-uiviews-rounded.html

Je suis venu sur cette mise en œuvre:

- (void)drawRect:(CGRect)rect { 

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(context); 
CGContextSetShadow(context, CGSizeMake(-15.0f, 20.0f), 5.0f); 

CGContextSetLineWidth(context, strokeWidth); 
CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor); 
CGContextSetFillColorWithColor(context, self.rectColor.CGColor); 

CGRect rrect = self.bounds; 

CGFloat radius = cornerRadius; 
CGFloat width = CGRectGetWidth(rrect); 
CGFloat height = CGRectGetHeight(rrect); 


// Make sure corner radius isn't larger than half the shorter side 
if (radius > width/2.0) 
    radius = width/2.0; 
if (radius > height/2.0) 
    radius = height/2.0;  

CGFloat minx = CGRectGetMinX(rrect); 
CGFloat midx = CGRectGetMidX(rrect); 
CGFloat maxx = CGRectGetMaxX(rrect); 
CGFloat miny = CGRectGetMinY(rrect); 
CGFloat midy = CGRectGetMidY(rrect); 
CGFloat maxy = CGRectGetMaxY(rrect); 
CGContextMoveToPoint(context, minx, midy); 
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
CGContextClosePath(context); 
CGContextDrawPath(context, kCGPathFillStroke); 

CGContextRestoreGState(context); 

} 

Cependant, quand il dessine, l'ombre est clipsé aux limites de la vue. J'ai essayé de régler self.clipsToBounds = NO mais cela n'affecte pas le problème.

+0

Cela a été répondu à un an plus tard sur une autre question: http://stackoverflow.com/questions/3690972/why-maskstobounds-yes-prevents-calayer-shadow Trick est d'avoir 2 UIViews. .. (un pour les virages ronds dans l'autre pour l'ombrage) –

Répondre

3

Que diriez-vous de dessiner l'ombre en utilisant Quartz Core à la place? Quelque chose comme:

view.layer.shadowColor = [UIColor blackColor].CGColor; 
view.layer.shadowOffset = CGSizeMake(0, 0); 
view.layer.shadowRadius = 4; 
view.layer.shadowOpacity = 1; 
view.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:view.frame cornerRadius:11].CGPath; // make sure you set that for better performance