2010-10-29 45 views
0

在我的一个应用程序中,我有一个自定义绘制的半透明UIView,我用它作为另一个UIView顶部的封面以获得特殊效果。CGContextSetLineWidth围绕路径变化宽度

下查看: alt text

下查看与自定义视图在最前面: alt text

它的工作原理,其巨大的iPhone在侧边只有10个像素,但现在我需要扩大左边和右边与其下面的行匹配。

这里是我的代码:

- (void)draw:(TTStyleContext*)context { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 

    [_color setStroke]; 
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth)); 

    CGFloat fw = context.frame.size.width; 
    CGFloat fh = context.frame.size.height; 

    CGContextMoveToPoint(ctx, fw, floor(fh/2)); 
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius)); 
    CGContextAddArcToPoint(ctx, 0, fh, 0, floor(fh/2), RD(_radius)); 
    CGContextAddArcToPoint(ctx, 0, 0, floor(fw/2), 0, RD(_radius)); 
    CGContextAddArcToPoint(ctx, fw, 0, fw, floor(fh/2), RD(_radius)); 
    CGContextClosePath(ctx); 
    CGContextStrokePath(ctx); 

    CGContextRestoreGState(ctx); 

    context.frame = CGRectInset(context.frame, _xwidth/2, _ywidth/2); 
    return [self.next draw:context]; 
} 

设置_xwidth_ywidth,这段代码的关键部分是MIN的笔触宽度后。这里的想法是,该框架默认情况下,相同的笔触宽度。我要求它做的是使两边的笔画宽度比顶部和底部的宽度更大。使用MIN可确保中风不会受到更厚的_xwidth尺寸并渗入中心。如果我使用的值为_ywidth,则边看起来很棒,但由于顶部和底部边框渗入中心,因此我不再获得透明红色。这使我想起了我的问题:

有没有办法让我指定我想要的行程是_xwidth厚两侧和_ywidth厚的顶部和底部?如果不是,还有另一种更容易忽视的方法吗?

我的代码,_xwidth设置为42,_ywidth设置为10,我得到这个: alt text 你可以看到我今天在这里,我需要怎么去一边行程来掩盖裸露的红背景。

回答

0

我能够通过改变路径,并与thiner线抚摸它,然后将另一行程围绕扩大矩形与较粗的线,以掩盖溢出

- (void)draw:(TTStyleContext*)context { 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 

    CGRect oldFrame = context.frame; 

    context.frame = CGRectInset(context.frame, (_xwidth > _ywidth ? _xwidth/2 : 0), (_ywidth > _xwidth ? _ywidth/2 : 0)); 
    CGFloat ox = (_xwidth > _ywidth ? _xwidth/2 - _ywidth/2 : 0); 
    CGFloat oy = (_ywidth > _xwidth ? _ywidth/2 - _xwidth/2 : 0); 
    CGFloat fw = context.frame.size.width + ox + (_xwidth > _ywidth ? _ywidth : 0); 
    CGFloat fh = context.frame.size.height + oy + (_ywidth > _xwidth ? _xwidth : 0); 

    CGContextMoveToPoint(ctx, fw, floor(fh/2)); 
    CGContextAddArcToPoint(ctx, fw, fh, floor(fw/2), fh, RD(_radius)); 
    CGContextAddArcToPoint(ctx, ox, fh, ox, floor(fh/2), RD(_radius)); 
    CGContextAddArcToPoint(ctx, ox, oy, floor(fw/2), oy, RD(_radius)); 
    CGContextAddArcToPoint(ctx, fw, oy, fw, floor(fh/2), RD(_radius)); 
    CGContextClosePath(ctx); 

    [_color setStroke]; 
    CGContextSetLineWidth(ctx, MIN(_xwidth, _ywidth)); 
    CGContextStrokePath(ctx); 

    if (_xwidth != _ywidth) { 
     CGContextSetLineWidth(ctx, MAX(_xwidth, _ywidth)); 
     CGContextStrokeRect(ctx, CGRectInset(oldFrame, (_ywidth > _xwidth ? -2*_xwidth : 0), (_xwidth > _ywidth ? -2*_ywidth : 0))); 
    } 

    CGContextRestoreGState(ctx); 

    context.frame = CGRectInset(oldFrame, _xwidth/2, _ywidth/2); 
    return [self.next draw:context]; 
} 

alt text

0

破解它简单地填写你正在抚摸的相同路径会简单很多。