2011-02-11 3 views
5

Я прочитал то, что, как я считаю, является соответствующими частями двумерного программирования кварца, но не могу найти ответ на следующее (они, похоже, не говорят много о iOS в документе):Как создать CGLayer из UIView для рисунка за пределами экрана

В моем приложении отображается чертеж в формате UIView. Время от времени я должен каким-то образом обновить чертеж, например. измените цвет заливки одной из фигур (я сохраняю CGPathRefs до важных фигур, чтобы иметь возможность перерисовывать их с другим цветом заливки позже). Как описано в разделе «Рисование С CGLayer» на странице 169 вышеупомянутого документа, я думал рисовать весь рисунок в виде CGContext, что я бы получить от CGLayer, например, так:

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

Тогда я мог бы сделать мое обновление за кадр в CGContext и сделать CGLayer в мой UIView в DrawRect UIView «s: метод, например, так:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

проблемы я имею, где я могу получить свою CGLayer от ? Мое понимание заключается в том, что я должен сделать это с помощью CGLayerCreateWithContext и поставить CGContext в качестве параметра, из которого он наследует большинство его свойств. Очевидно, что правильный контекст будет контекст UIView, что я получаю с

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

, но если я не ошибаюсь, я могу получить только, что в drawRect: метод, и он не является допустимым предположить, что контекст, который я даю там, будет таким же в следующий раз, когда будет вызван метод, т. е. я могу использовать только этот CGContext локально внутри метода.

Итак, как я могу получить CGContext, что я могу использовать, чтобы инициализировать мой CGLayer создать закадровый CGContext рисовать в, а затем сделать весь слой обратно в мои UIView «s CGContext?

PS: Пока вы на нем; если что-либо выше не имеет смысла или не является нормальным, сообщите мне. Я только начинаю опускать голову над кварцем 2D.

ответ

1

Прежде всего, если вы делаете это из среды iOS, я думаю, что вы правы. Документация четко сказал, что единственный способ для получения CGContextRef является

CGContextRef ctx = UIGraphicGetCurrentContext(); 

Затем вы используете этот контекст для создания CGLayer с

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL); 

И если вы хотите рисовать на этом слое, то есть рисовать его с контекстом, который вы получаете от слоя. (Он несколько отличается от контекста, который вы ранее использовали для создания CGLayer). Я предполагаю, что CGLayerCreateWithContext сохраняет информацию, которую он может получить из контекста, переданного, но не все. (Одним из примеров является информация ColorSpace, вам нужно повторно указать, когда вы заполняете что-то в контексте от CGLayer).

Вы можете получить справочную ссылку CGLayer из функции CGLayerGetContext() и использовать ее для рисования.

CGContextRef layerCtx = CGLayerGetContext(layer); 
CGContextBeginPath(layerCtx); 
CGContextMoveToPoint(layerCtx, -10, 10); 
CGContextAddLineToPoint(layerCtx, 100, 10); 
CGContextAddLineToPoint(layerCtx, 100, 100); 
CGContextClosePath(layerCtx); 

Один момент, который я узнал, это когда вы рисуете что-то вне экрана, оно автоматически зацикливает вещь на экране. (иметь смысл, поэтому он не рисует вещи, которые не видны), но когда вы перемещаете слой (используя матричное преобразование). Обрезанный путь не отображается (отсутствует).

Одна последняя вещь, если вы сохраните ссылку на слой в переменную и в дальнейшем вы хотите сделать это, вы можете использовать CGContextDrawLayerAtPoint() метод как

CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

Это будет своего рода «stampt» или " нарисуйте "слой в этой новой точке и новой координате PointY.

Я надеюсь, что ответ на ваш вопрос, если его не сообщите, пожалуйста, дайте мне знать.

+0

Я также застрял в проблеме CGLayer, я не понимаю, как писать в нее в моих затронутых функциях, можете ли вы взглянуть на мое сообщение http://stackoverflow.com/questions/11341763/how-to- use-cglayer-for-optim-drawing – Ranjit

+0

CGContextBeginPath() и CGContextClosePath() принимают параметр контекста. – Ant

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