2

画画

  • 底部,左侧和右侧的边框。
  • 底部圆角
  • 剪辑到边框
  • 用可能在 .xib 文件中设置的实际颜色填充颜色,但在下面的代码中,我将颜色设置为清除颜色。

对于上述内容和下面列出的代码,我得到以下输出。

在此处输入图像描述

可以在图像中找到所需输出的粗略概念,如下所示。在此处输入图像描述

-(id) initWithCoder:(NSCoder *)aDecoder{
    self=[super initWithCoder:aDecoder];
    if(self){
        self.clipsToBounds=YES;
        self.backgroundColor=[UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    // Drawing code

    CGFloat margin=2.0;
    CGRect outerRect=CGRectInset(rect, margin, margin);
    CGMutablePathRef path=createRoundedRectForRect(outerRect, 10.0);

    CGFloat margin1=1.0;
    CGRect innerRect=CGRectInset(outerRect, margin1, margin1);
    CGMutablePathRef innerPath=createRoundedRectForRect(innerRect, 5.0);
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextAddPath(context, path);
    CGContextAddPath(context, innerPath);
    CGContextClip(context);

    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor
                                    );
    CGContextStrokeRect(context, rect);

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor
                                   );
    CGContextFillRect(context, innerRect);

    CGContextRestoreGState(context);
}



CGMutablePathRef createRoundedRectForRect (CGRect rect, CGFloat radius){
    CGMutablePathRef path=CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect));

    CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMaxY(rect), radius);

    CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMinY(rect), radius);

    CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rect),CGRectGetMinY(rect));

    return path;
}

第 2 部分,更改

以下这些更改为我提供了以下输出,其中“添加”按钮仍然重叠并且未剪裁到边框。

输出几乎是预期的,如下图所示。

在此处输入图像描述

- (void)drawRect:(CGRect)rect
{
    CGSize radii=CGSizeMake(10.0, 10.0);
    UIBezierPath *path=[UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:radii];
    [[UIColor blackColor] setFill];
    [path fill];

    CGFloat margin=4.0;
    CGRect innerRect=CGRectMake(rect.origin.x+margin, 0, rect.size.width-(2*margin), rect.size.height-margin);

    //Scaling InnerRadii
    CGSize radii2=CGSizeMake(radii.width-margin, radii.height-margin);
    UIBezierPath *innerPath=[UIBezierPath bezierPathWithRoundedRect:innerRect byRoundingCorners:UIRectCornerBottomRight|UIRectCornerBottomLeft cornerRadii:radii2];

    [[UIColor redColor] setFill];
    [innerPath fill];

}
4

1 回答 1

7

这是我将如何做到的。我会创建一个底角圆角的外部矩形。然后,我会复制这个矩形并改变它的尺寸,让它稍微小一点,并将它覆盖在第一个矩形的顶部。

- (void) drawRect:(CGRect)rect
{
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect
       byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10.0f, 10.0f)];

    [[UIColor blackColor] setFill];
    [path fill];

    CGRect innerRect = CGRectInset(rect, 4.0f, 2.0f);
    innerRect.origin.y -= 2.0f;

    UIBezierPath *innerPath = [UIBezierPath bezierPathWithRoundedRect:innerRect
        byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(8.0f, 8.0f)];

    [[UIColor redColor] setFill];
    [innerPath fill];
}

这会产生以下输出:

在此处输入图像描述

编辑:按照 Paul.s 的建议缩放cornerRadii。

于 2013-04-13T22:01:53.290 回答