如何设置UILabel非矩形框架

时间:2013-09-02 11:49:01

标签: iphone ios objective-c cocoa-touch core-graphics

我试图制作一个边缘看起来像下图的UILabel。

enter image description here

以下是drawRect:子类中的UILabel

-(void)drawRect:(CGRect)rect{

        [super drawRect:rect];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSaveGState(context);
        CGRect labelRect = self.bounds;

        CGPoint bottomPoint = CGPointMake(labelRect.size.width, rect.size.height);
        CGPoint topMinus30Point =CGPointMake(labelRect.size.width-30, 0);
        CGPoint topPoint = CGPointMake(labelRect.size.width, 0);

        CGContextBeginPath (context);
        //from bottom to -30 top
        CGContextMoveToPoint(context, bottomPoint.x,bottomPoint.y);
        CGContextAddLineToPoint(context, topMinus30Point.x,topMinus30Point.y);

        //from -30 to top
        CGContextMoveToPoint(context, topMinus30Point.x,topMinus30Point.y);
        CGContextAddLineToPoint(context, topPoint.x,topPoint.y);

        //from top to bottom
        CGContextMoveToPoint(context, topPoint.x,topPoint.y);
        CGContextAddLineToPoint(context, bottomPoint.x,bottomPoint.y);
        CGContextClosePath(context);

        CGContextStrokePath(context);
        CGContextRestoreGState(context);

}

如何从当前帧裁剪创建的路径?
[我刚刚开始使用Core Graphics,所以请温柔:)]

关于如何实现这一点的任何指示都会非常有用 谢谢

2 个答案:

答案 0 :(得分:2)

试试这个:

- (void)drawRect:(CGRect)rect
{

    CGContextRef context = UIGraphicsGetCurrentContext();

    // clear drawing rect
    CGContextClearRect(context, rect);

    // save 1
    CGContextSaveGState(context);

    CGRect labelRect = self.bounds;
    CGPoint bottomPoint = CGPointMake(labelRect.size.width, rect.size.height);
    CGPoint topMinus30Point = CGPointMake(labelRect.size.width-30, 0);
    CGPoint topPoint = CGPointMake(labelRect.size.width, 0);

    CGContextBeginPath(context);

    CGContextMoveToPoint(context, 0.0f, 0.0f);
    CGContextAddLineToPoint(context, topMinus30Point.x, topMinus30Point.y);
    CGContextAddLineToPoint(context, bottomPoint.x, bottomPoint.y);
    CGContextAddLineToPoint(context, 0.0f, bottomPoint.y);
    CGContextAddLineToPoint(context, 0.0f, 0.0f);

    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextDrawPath(context, kCGPathFill);

    // restore 1
    CGContextRestoreGState(context);

}

将它放在您使用的初始化中:

[self setBackgroundColor:[UIColor clearColor]];

答案 1 :(得分:0)

一种方法是,

将label的背景颜色设置为clear color,并使用CGContext在drawRect方法中绘制所需的形状。

你的drawRect会变成这样的

- (void)drawRect:(CGRect)rect{

[super drawRect:rect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect labelRect = self.bounds;


CGPoint bottomPoint = CGPointMake(labelRect.size.width, rect.size.height);
CGPoint topMinus30Point =CGPointMake(labelRect.size.width-30, 0);

//from bottom to -30 top

CGContextMoveToPoint(context, self.bounds.origin.x,self.bounds.origin.y);
CGContextAddLineToPoint(context, topMinus30Point.x,topMinus30Point.y);
CGContextAddLineToPoint(context, bottomPoint.x,bottomPoint.y);
CGContextAddLineToPoint(context, self.bounds.origin.x,self.bounds.origin.x + self.bounds.size.height);
CGContextAddLineToPoint(context, self.bounds.origin.x,self.bounds.origin.y);


CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
CGContextFillPath(context);

}

另一种方法是使用CGContextClip使用此方法,您的drawRect将变为这样

CGContextMoveToPoint(context, self.bounds.origin.x,self.bounds.origin.y);
CGContextAddLineToPoint(context, topMinus30Point.x,topMinus30Point.y);
CGContextAddLineToPoint(context, bottomPoint.x,bottomPoint.y);
CGContextAddLineToPoint(context, self.bounds.origin.x,self.bounds.origin.x + self.bounds.size.height);
CGContextAddLineToPoint(context, self.bounds.origin.x,self.bounds.origin.y);
CGContextClip(context);

CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
CGContextFillRect(context, self.bounds);

希望这有帮助