代码之家  ›  专栏  ›  技术社区  ›  Martin

带圆角矩形和放置阴影的uiview:阴影显示在矩形上方

  •  24
  • Martin  · 技术社区  · 16 年前

    我有一个uiview子类,在那里我试图画一个带有阴影的圆角矩形。虽然它绘制了两个元素,但我可以通过圆角矩形填充看到阴影。我对CG不熟悉,所以我可能遗漏了一些简单的东西(尽管它似乎不是填充的alpha设置为1)。这是draw rect代码。

    - (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);
    }
    
    3 回复  |  直到 13 年前
        1
  •  17
  •   Stefan Arentz    16 年前

    - (void)drawRect:(CGRect)rect
    {
        // get the contect
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        //now draw the rounded rectangle
        CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
        CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 0.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 = 45;
        // 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);
    
        {
            //for the shadow, save the state then draw the shadow
            CGContextSaveGState(context);
    
            // 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);
    
            CGContextSetShadow(context, CGSizeMake(4,-5), 10);
            CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
    
            // Fill & stroke the path
            CGContextDrawPath(context, kCGPathFillStroke);
    
            //for the shadow
            CGContextRestoreGState(context);
        }
    
        {
            // 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);
    
            CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
            CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);       
    
            // Fill & stroke the path
            CGContextDrawPath(context, kCGPathFillStroke);
        }
    }
    
        2
  •  39
  •   Lee Probert    14 年前
    - (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];
    }
    
        3
  •  15
  •   Jesse Beder    13 年前

    QuartzCore/QuartzCore.h

    yourView.layer.shadowColor = [[UIColor blackColor] CGColor];
    yourView.layer.shadowOffset = CGSizeMake(10.0f, 10.0f);
    yourView.layer.shadowOpacity = 1.0f;
    yourView.layer.shadowRadius = 10.0f;
    
    推荐文章