2013-03-22 2 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(), чтобы получить ссылку на текущий контекст.

Смежные вопросы