2013-03-22 97 views
0

我想学习和CoreGraphics的我遇到一个奇怪的现象,奇怪的行为,希望有人能帮助我明白怎么回事...与UIBezierPath addClip

我绘制一个矩形,并在其中我画给量钻石,形状可以与不同的填充要绘制的(空的,填充并与条纹)我的拉伸矩形函数看起来像这样:

- (void)drawRect:(CGRect)rect 
{ 
    UIBezierPath* roundedRect = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:9.0]; 

    //don't draw where the round corners "cut" the rectangle 
    [roundedRect addClip]; 

    //set a white background 
    [[UIColor whiteColor] setFill]; 
    UIRectFill(self.bounds); 

    //set a black frame 
    [[UIColor darkGrayColor] setStroke]; 
    [roundedRect stroke]; 

    self.shade = STRIPED; 
    self.color = [UIColor greenColor]; 
    self.number = 3; 
    rectOffset = self.bounds.size.width/(self.number * 2); 
    [self drawDiamondNumberOfTimes:self.number startOrigin:self.bounds.origin]; 
} 

drawDiamondNumberOfTimes:startOrigin:是计算矩形的递归函数,其中的形状将使用笔划绘制并绘制钻石边界

- (void) drawDiamondNumberOfTimes:(int) p_times startOrigin:(CGPoint) p_origin 
{ 
    if(p_times > 0) 
    { 
     CGRect drawArea; 
     drawArea.origin = CGPointMake(p_origin.x + rectOffset-shapeSize.width/2, self.bounds.size.height/4); 
     drawArea.size = shapeSize; 

     UIBezierPath *diamond = [[UIBezierPath alloc] init]; 
     [diamond moveToPoint:CGPointMake(drawArea.origin.x, drawArea.origin.y+ shapeSize.height/2)]; 
     [diamond addLineToPoint:CGPointMake(drawArea.origin.x+shapeSize.width/2, drawArea.origin.y)]; 
     [diamond addLineToPoint:CGPointMake(drawArea.origin.x+shapeSize.width, drawArea.origin.y+ shapeSize.height/2)]; 
     [diamond addLineToPoint:CGPointMake(drawArea.origin.x+shapeSize.width/2, drawArea.origin.y+ shapeSize.height)]; 
     [diamond closePath]; 

     [self.color setStroke]; 
     [diamond stroke]; 
     [self drawShadeOfDraw:diamond atRect:drawArea]; 

     drawArea.origin.x += rectOffset + shapeSize.width/2; 
     [self drawDiamondNumberOfTimes:p_times-1 startOrigin:drawArea.origin ]; 
    } 
} 

drawShadeOfDraw:atRect:设置不同的填充 - 在发生奇怪的行为:) 空和固体填充它的作品完美,但有条纹,如果我写[p_symbol addClip]我总是得到一个菱形条纹即使self.number设置为2或3。无[p_symbol addClip]我得到的钻石正确的号码,但是,当然,条纹遍布长方形,这里是drawShadeOfDraw代码:atRect:

- (void)drawShadeOfDraw:(UIBezierPath*)p_symbol atRect:(CGRect)p_drawArea 
{ 
    switch (self.shade) 
    { 
     case STRIPED: 
     { 
      [p_symbol addClip]; 
      for(int y = p_drawArea.origin.y; y < p_drawArea.origin.y+ p_drawArea.size.height; y+= 6) 
      { 
       [p_symbol moveToPoint:CGPointMake(p_drawArea.origin.x, y)]; 
       [p_symbol addLineToPoint:CGPointMake(p_drawArea.origin.x+shapeSize.width, y)]; 
       [self.color setStroke]; 
       [p_symbol stroke]; 
      } 
      break; 
     } 
     case SOLID: 
     { 
      [self.color setFill]; 
      [p_symbol fill]; 
      break; 
     } 
     default: 
     { 
      break; 
     } 
    } 
} 

一个图像比千字好,所以这里有两个:)

this is how it looks with addClip and without addClip

希望有人能帮助我理解它是如何工作的,什么我做错了

感谢

回答

3

添加到剪辑是半永久性的。一旦裁剪区域“减少”,就不能再增长它本身。您只能将其恢复到以前的状态。要做到这一点,请在设置上下文状态(包括剪辑)之前调用CGContextSaveGState(),使用该状态执行一些绘图,然后调用CGContextRestoreGState()将上下文状态恢复到之前的状态。

所以,我建议你用调用括起你的两个方法来保存和恢复上下文状态。使用UIGraphicsGetCurrentContext()获取对当前上下文的引用。