2013-03-22 39 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()獲取對當前上下文的引用。