2011-09-08 35 views
2

我尝试使用下面的代码来绘制简单的语音泡:自定义的UIView的边界图纸不顺畅

@implementation SpeechBubbleView 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 

    CGPoint triangleHeadPoint = CGPointMake(0, rect.size.height/2.0); 
    float triangleHeight = 5; 
    float triangleWidth = 10; 

    float maxX = rect.size.width; 
    float minX = 0.0; 
    float maxY = rect.size.height; 
    float minY = 0.0; 

    float archTangentLine = 6.0; 
    float archRadius = archTangentLine; 

    float strokeWidth = 1.0; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetLineWidth(context, strokeWidth); 

    CGContextBeginPath(context); 

    float currentX = triangleHeadPoint.x; 
    float currentY = triangleHeadPoint.y; 
    CGContextMoveToPoint(context, currentX, currentY); 

    currentX += triangleWidth; 
    currentY += (triangleHeight/2.0); 
    CGContextAddLineToPoint(context, currentX, currentY); 

    currentY = maxY - archTangentLine; 
    CGContextAddLineToPoint(context, currentX, currentY); 

    currentY += archTangentLine; 
    CGContextAddArcToPoint(context, currentX, currentY, currentX + archTangentLine, currentY, archRadius); 

    currentX = maxX - archTangentLine; 
    CGContextAddLineToPoint(context, currentX, currentY); 

    currentX += archTangentLine; 
    CGContextAddArcToPoint(context, currentX, currentY, currentX, currentY - archTangentLine, archRadius); 

    currentY = minY + archTangentLine; 
    CGContextAddLineToPoint(context, currentX, currentY); 

    currentY -= archTangentLine; 
    CGContextAddArcToPoint(context, currentX, currentY, currentX - archTangentLine, currentY, archRadius); 

    currentX = minX + triangleWidth + archTangentLine; 
    CGContextAddLineToPoint(context, currentX, currentY); 

    currentX -= archTangentLine; 
    CGContextAddArcToPoint(context, currentX, currentY, currentX, currentY + archTangentLine, archRadius); 

    currentY = triangleHeadPoint.y - (triangleHeight/2.0); 
    CGContextAddLineToPoint(context, currentX, currentY); 

    CGContextClosePath(context); 

    [[UIColor whiteColor] setFill]; 
    [[UIColor blackColor] setStroke]; 

    CGContextDrawPath(context, kCGPathFillStroke); 
} 

@end 

这段代码的结果如下(不那么漂亮)图像:

enter image description here

绘图不像我期待的那样平滑,左侧边框比顶部,右侧和底部宽,而且边角比邻近线更宽。

我改变填充颜色为黑色只是为了检查,结果是我所期待的:

enter image description here

为什么边框具有可变宽度是多少?有没有办法解决这个问题,并在视图周围有一个平滑的边框?

在此先感谢。

回答

6

以供将来参考,我已经找到一种方法,以改善边境的外观,这将导致在下面的图片:

enter image description here

我只是做边框的宽度非常小(我用0.2F )使用函数CGContextSetLineWidth(context,0.2f)。然后为该图层添加一个阴影如下:

self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
self.layer.shadowOffset = CGSizeMake(1.5f, 1.5f); 
self.layer.shadowOpacity = 0.8f; 
self.layer.shadowRadius = 1.0f; 

就是这样!