2013-05-15 3 views
0

У меня есть два прямоугольника (два закрытых суб cgpaths). Прямоугольник B маленький и присутствует внутри прямоугольника A. Все ребра внутри него. Есть ли прямой способ заполнения цветовой области, внешней по отношению к прямоугольнику B.Внешний цвет заливки в iOS

CAShapeLayer fillExternalColor что-то в этом роде? Если не прямой путь, как это сделать программно?

A - Фиолетовый цвет B - Желтый цвет

Drawing A and then drawing B Drawing B and then drawing A

Так что я попытался рисунок A, а затем рисунок B. Я хотел B, чтобы быть ясным цветом (сейчас я ставлю желтый), но то я вижу фиолетовый цвет A ..

Я нашел метод CGRectIntersection, который дает метод AnB и CGRectUnion, который дает AuB. Есть ли метод, который дает остальную часть области, которая является AuB - AnB?

+0

Вы говорите о чертеже * снаружи * прямо, правильно? – Undo

+0

Вы просто пытаетесь заполнить прямоугольник A? Вы должны знать внешние границы каким-то образом ... – Wain

+0

@ Ундо да ... рисование цвета снаружи B, но внутри A –

ответ

2

Вы используете CAShapeLayer. Если ваши fillColor и ваш strokeColor являются непрозрачными (alpha 1.0), вы можете просто установить backgroundColor слоя, чтобы заполнить те пиксели, которые находятся в пределах слоя, но за пределами его поглаженного и заполненного пути.

Мой тестовый код:

@implementation ViewController { 
    CAShapeLayer *layer; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    layer = [CAShapeLayer layer]; 
    layer.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 250, 250)].CGPath; 
    layer.fillColor = [UIColor yellowColor].CGColor; 
    layer.strokeColor = [UIColor whiteColor].CGColor; 
    layer.lineWidth = 4; 
    layer.backgroundColor = [UIColor purpleColor].CGColor; 
    [self.view.layer addSublayer:layer]; 
} 

- (void)viewDidLayoutSubviews { 
    layer.frame = self.view.bounds; 
} 

@end 

Результат:

screen shot of test app

-1

kCAFillRuleEvenOdd

Задает четно-нечетные обмотки правила. Подсчитайте общее количество пересечений путей. Если количество пересечений четное, точка находится за пределами пути. Если количество пересечений нечетно, точка находится внутри пути, и область, содержащая ее, должна быть заполнена.

Доступен в OS X v10.6 и более поздних версиях.

Объявлено в CAShapeLayer.h.

См: CAShapeLayer Class reference

0

Предполагая, что А является тем больше формы, В являются меньшей, внутренней формой и граница относится к содержащему прямоугольнику А (вероятно, пределы зрения)

  1. Клип форма B к контексту (-addClip должен это сделать)
  2. CGContextClearRect границы
  3. Заполните форму
+0

вы можете уточнить, когда вы скажете addClip? –

+0

[-addClip] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIBezierPath_class/Reference/Reference.html#//apple_ref/occ/instm/UIBezierPath/addClip) – Allyn

+0

Прошу прощения но я не могу следовать вашему предложению. У меня есть CGRect innerRect и CGRect outerRect. И я рисую вещи в отдельном методе, который убегает от основного потока dispatch_sync (dispatch_get_main_queue(),^{[self displayRectangles: rectangles withLineColor: lineColor];}); Позже я создаю CAShapeLayer и добавляю этот слой к представлению в качестве субслоя. –

0

Edit, нашел source of this code

Данный HoleView : UIView вы должны установить:

self.opaque = NO; 
self.backgroudColor = [UIColor clearColor]; 

и drawRect:

[[UIColor purpleColor] setFill]; 
UIRectFill(A); 

CGRect gapRectIntersection = CGRectIntersection(B, A);  
[[UIColor clearColor] setFill]; 
UIRectFill(gapRectIntersection); 
1

Я хотел бы добавить красную границу внутренний прямоугольник на UIImage с замаскированной внешней части.

Я пришел через эту страницу. Следующий код использует CGContextEOFillPath может быть полезным для других, таких как я. (Некоторые из кода собраны с других страниц.)

-(UIImage) imageByDrawingBorderRectOnImage:(UIImage)image theRect:(CGRect)theRect 
    { 
     // begin a graphics context of sufficient size 
     UIGraphicsBeginImageContext(image.size); 

     // draw original image into the context 
     [image drawAtPoint:CGPointZero]; 

     // get the context for CoreGraphics 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 

     // set stroking color and to draw rect 
     [[UIColor redColor] setStroke]; 

     // drawing with a red stroke color 
     CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0); 

     // the line width to 3 
     CGContextSetLineWidth(ctx, 3.0); 

     // Add Stroke Rectangle, 
     CGContextStrokeRect(ctx, theRect); 

     // Now draw fill outside part with partial alpha gray color 
     // drawing with a gray stroke color 
     CGMutablePathRef aPath = CGPathCreateMutable(); 
     // outer rectangle 
     CGRect rectangle = CGRectMake(0, 0, image.size.width, image.size.height); 
     CGPathAddRect(aPath, nil, rectangle); 
     // innter rectangle 
     CGPathAddRect(aPath, nil, theRect); 
     // set gray transparent color 
     CGContextSetFillColorWithColor(ctx, [UIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:0.5].CGColor); 
     // add the path to Context 
     CGContextAddPath(ctx, aPath); 
     // This method uses Even-Odd Method to draw in outer rectangle 
     CGContextEOFillPath(ctx); 

     // make image out of bitmap context 
     UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext(); 

     // free the context 
     UIGraphicsEndImageContext(); 

     return retImage; 
    } 

С уважением.

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