Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIView with rounded rectangle and drop shadow: shadow appears above rectangle

Tags:

I've got a uiview subclass where I'm trying to draw a rounded rectangle with a drop shadow. Though it draws both elements, I can see shadow through the rounded rectangle fill. I'm new to CG so I'm probably missing something simple (though it doesn't seem to be the alpha of the fill which is set to 1). Here's the draw rect code.

- (void)drawRect:(CGRect)rect {     // get the contect  CGContextRef context = UIGraphicsGetCurrentContext();   //for the shadow, save the state then draw the shadow  CGContextSaveGState(context);     CGContextSetShadow(context, CGSizeMake(4,-5), 10);     //now draw the rounded rectangle  CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);  CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);   //since I need room in my rect for the shadow, make the rounded rectangle a little smaller than frame  CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect)-30, CGRectGetHeight(rect)-30);  CGFloat radius = self.cornerRadius;  // the rest is pretty much copied from Apples example  CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);  CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);   // Start at 1  CGContextMoveToPoint(context, minx, midy);  // Add an arc through 2 to 3  CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);  // Add an arc through 4 to 5  CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);  // Add an arc through 6 to 7  CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);  // Add an arc through 8 to 9  CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);  // Close the path  CGContextClosePath(context);  // Fill & stroke the path  CGContextDrawPath(context, kCGPathFillStroke);   //for the shadow   CGContextRestoreGState(context); } 
like image 574
Martin Avatar asked Feb 21 '10 19:02

Martin


1 Answers

- (void)drawRect:(CGRect)rect {     self.layer.masksToBounds = NO;     self.layer.shadowColor = [[UIColor whiteColor] CGColor];     self.layer.shadowOffset = CGSizeMake(0,2);     self.layer.shadowRadius = 2;     self.layer.shadowOpacity = 0.2;      UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(20, 20)];     [[UIColor blackColor] setFill];      [path fill]; } 
like image 114
Lee Probert Avatar answered Sep 24 '22 20:09

Lee Probert