2012-08-29 4 views
1

Мне нужно заполнить мой метод UIView методом drawRect() с помощью «реверсивного многоугольника» - все на виду заполнено цветом, кроме самого полигона.UIView drawRect(): заполнить все, кроме полигона

Я получил этот код, чтобы нарисовать простой многоугольник:

CGContextBeginPath(context); 
for(int i = 0; i < corners.count; ++i) 
{ 
    CGPoint cur = [self cornerAt:i], next = [self cornerAt:(i + 1) % corners.count]; 
    if(i == 0) 
     CGContextMoveToPoint(context, cur.x, cur.y); 
    CGContextAddLineToPoint(context, next.x, next.y); 
} 
CGContextClosePath(context); 
CGContextFillPath(context); 

я нашел подобный вопрос, но в C#, не Obj-C: c# fill everything but GraphicsPath

+0

Вы можете заполнить весь вид с цветом заливки и чем сделать свой полигон над ним, используя ясный цвет – Sohaib

+0

попробовать то же самое, как и в C# код: CGContextAddRect (контекст, self.bounds) перед CGContextClosePath – Felix

ответ

3

Вероятно, самый быстрый способ установить клип:

// create your path as posted 
// but don't fill it (remove the last line) 

CGContextAddRect(context, self.bounds); 
CGContextEOClip(context); 

CGContextSetRGBFillColor(context, 1, 1, 0, 1); 
CGContextFillRect(context, self.bounds); 

Оба другие ответы предложить на первый заполнить прямоугольник, а затем нарисовать фигуру с четким цветом сверху. Оба опускают необходимый режим смешивания. Вот рабочая версия:

CGContextSetRGBFillColor(context, 1, 1, 0, 1); 
CGContextFillRect(context, self.bounds); 

CGContextSetBlendMode(context, kCGBlendModeClear); 

// create and fill your path as posted 

Edit: Оба подхода требуют backgroundColor быть clearColor и opaque быть установлен в NO.

Second Редактировать: Оригинальный вопрос был о Core Graphics. Конечно, есть и другие способы маскирования части представления. В первую очередь CALayermask Недвижимость.

Вы можете установить это свойство в экземпляр CAPathLayer, который содержит ваш путь клипа, чтобы создать эффект трафарета.

+0

Спасибо, это работает!Первое решение лучше, потому что оно не обрезает весь вид и дает возможность рисовать что-то еще внутри обрезанного многоугольника. Кроме того, он работает с 'opaque' установленным' YES' каким-то образом. :) – dreamzor

+0

@dreamzor Рад, что я мог бы помочь. Я бы не стал полагаться на то, что он работал для вас с 'opaque = YES'. –

+0

Прошло некоторое время, но теперь я обнаружил, что этот путь слишком медленный. Можно ли это сделать другим способом, используя CALayer или что-то еще? Это не похоже на тяжелую работу по рисованию ... – dreamzor

0

в DrawRect и можно установить фон цвет ур с цветом и хотите

self.backgroundColor = [UIcolor redColor]; //set ur color 

а затем нарисовать полигон так, как ур делает.

CGContextBeginPath(context); 
for(int i = 0; i < corners.count; ++i) 
{ 
    CGPoint cur = [self cornerAt:i], next = [self cornerAt:(i + 1) % corners.count]; 
    if(i == 0) 
     CGContextMoveToPoint(context, cur.x, cur.y); 
    CGContextAddLineToPoint(context, next.x, next.y); 
} 
CGContextClosePath(context); 
CGContextFillPath(context); 

надеюсь, что это помогает .. счастливым кодирования :)

+0

я собирался предложить То же самое, @ Resh32 тоже имела аналогичную идею – Kezzer

+0

Вы не должны устанавливать backgroundColor из 'drawRect'. Кроме того, ваш подход не создает прозрачную форму. –

0

Создать новую CGLayer, заполнить его с внешним цветом, а затем сделать свой полигон, используя ясный цвет.

layer1 = CGLayerCreateWithContext(context, self.bounds.size, NULL); 
context1 = CGLayerGetContext(layer1); 

[... fill entire layer ...] 

CGContextSetFillColorWithColor(self.context1, [[UIColor clearColor] CGColor]); 

[... draw your polygon ...] 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextDrawLayerAtPoint(context, CGPointZero, layer1); 
+0

Для чего нужен CGLayer? Мне кажется ненужным накладные расходы. –

+0

Кроме того, рисование с четким цветом с использованием режима смешивания по умолчанию (porter-duff over) - это не-op. –

+0

CGLayer понадобится, если в главном контексте уже есть другие элементы, нарисованные на нем (я не знаю остальных частей приложения). – Resh32

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