IOS - 绘制圆角方形

时间:2014-05-14 09:43:51

标签: ios objective-c cgcontext

我正在尝试创建一个带圆角的200像素正方形,用作IOS吐司风格指示。

到目前为止我有以下内容 -

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.1].CGColor);
    CGContextMoveToPoint(context, 10, 0);
    CGContextAddLineToPoint(context, 95, 0);
    CGContextAddArcToPoint(context, 100, 0, 100, 5, 10);
    CGContextAddLineToPoint(context, 100, 95);
    CGContextAddArcToPoint(context, 100, 100, 95, 100, 10);
    CGContextAddLineToPoint(context, 5, 100);
    CGContextAddArcToPoint(context, 0, 100, 0, 95, 10);
    CGContextAddLineToPoint(context, 0, 5);
    CGContextAddArcToPoint(context, 0, 0, 5, 0, 10);
    CGContextFillPath(context);
}

我通过一个教程得到了这一点 - 它绘制了一个完美的100px圆角方形 - 但我需要一个150px的方形!我已经改变了所有可以想象的设置 - 有一些古怪的结果 - 但是无法弄清楚如何定义宽度高度!?有人可以建议吗?

4 个答案:

答案 0 :(得分:14)

如果导入QuartzCore框架:

#import <QuartzCore/QuartzCore.h>

并将其添加到您的项目中,您可以使用以下内容:

UIView *temp = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
temp.layer.cornerRadius = 5;

答案 1 :(得分:10)

如果您必须绘制drawRect并且将来会绘制其他内容,那么只需使用bezierpath,否则请参阅Simon对视图中简单圆角的回答

- (void)drawRect:(CGRect)rect {
       [super drawRect:rect];
       [[UIColor blueColor] setFill];
       UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect /*CGRectMake(0, 0, 150, 150)*/ cornerRadius:10.0];
       [path fill];
}

答案 2 :(得分:5)

  1. 将数字转换为变量/常量。

  2. 更改变量/常量值。

  3. 利润!

  4. 这是您的代码,经过修改后显示我的意思(未经测试):

    - (void)drawRect:(CGRect)rect {
        static CGFloat length = 100;
        static CGFloat rounding = 5;
    
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.1].CGColor);
        CGContextMoveToPoint(context, rounding * 2, 0);
        CGContextAddLineToPoint(context, length - rounding, 0);
        CGContextAddArcToPoint(context, length, 0, length, rounding, rounding * 2);
        CGContextAddLineToPoint(context, length, length - rounding);
        CGContextAddArcToPoint(context, length, length, length - rounding, length, rounding * 2);
        CGContextAddLineToPoint(context, rounding, length);
        CGContextAddArcToPoint(context, 0, length, 0, length - rounding, rounding * 2);
        CGContextAddLineToPoint(context, 0, rounding);
        CGContextAddArcToPoint(context, 0, 0, rounding, 0, rounding * 2);
        CGContextFillPath(context);
    }
    

    我也想知道代码中的10个。据我所知,他们应该是5s而不是。无论如何,更容易的解决方案是使用UIBezierPath,正如其他人已经证明的那样(层解决方案确实有效,但是如果你想要在圆角矩形下方绘制一些东西以及它上面的某些东西,它显然不会起作用。 )。

答案 3 :(得分:3)

为什么不使用bezier路径?

CGFloat radius =  4;
CGRect rect = CGRectMake(0,0,200,200);
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius];
[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.1] setFill];
[path fill];