2011-02-11 5 views
5

Quartz 2D 프로그래밍 가이드의 관련 부분으로 읽었지만 다음에 대한 답변을 찾을 수 없습니다 (그들은 대화하는 것처럼 보이지 않습니다). 문서의 iOS에 관한 내용이 많습니다.)오프 스크린 드로잉을 위해 UIView에서 CGLayer를 생성하는 방법

내 응용 프로그램은 UIView에 그림을 표시합니다. 때때로 나는 그림을 어떤 식 으로든 업데이트해야한다. 모양 중 하나의 채우기 색상을 변경하십시오 (다른 채우기 색상으로 나중에 다시 그릴 수 있도록 CGPathRefs을 중요한 모양으로 유지). 나는 그런

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

: 섹션 상기 문서의 169 페이지의 "CGLayer으로 그리기"에 설명 된대로, 나는 내가 그렇게처럼 CGLayer에서 얻는 것 CGContext로 전체 그림을 그리는 생각했다 UIView의의 drawRect 내 UIView의에 CGLayerCGContext로 오프 스크린 내 업데이트를하고 그릴 수 : 방법,과 같이 : 나는에서 내 CGLayer을받을 수 있나요 오전 데 문제가

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

을, ? 내 이해는 CGLayerCreateWithContext을 사용하여 만들어야하고 대부분의 속성을 상속받는 매개 변수로 CGContext을 제공해야합니다. 물론, 올바른 문맥 내가

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

으로 얻고 있지만, 내가 잘못 아니에요, 난 단지 drawRect 내 것을 얻을 수는 UIView의 상황이 될 것이다 : 방법이 있다고 가정하는 것이 유효하지 않습니다 내가 거기에 주어진 문맥은 메소드가 호출 될 때 같은 다음 객체가 될 것입니다. 즉, 메소드 내에서 로컬로만 CGContext을 사용할 수 있습니다. 그래서

, 어떻게 내가 초기화하는 데 사용할 수있는 CGContext 얻을 수 내 CGLayer으로 그릴 수있는 오프 스크린 CGContext을 만든 다음 내 UIViewCGContext에 다시 전체 레이어를 그릴?

추신 : 당신이 그것에있는 동안; 위의 내용이 모두 이해가되지 않거나 제정신이 아닐 경우 알려주십시오. 나는 방금 석영 2D 주위에 머리를 갖기 시작했다.

답변

1

우선 iOS 환경에서이 작업을 수행하는 경우 사용자가 옳다고 생각합니다. 문서는 명확 유일한 방법은

CGContextRef ctx = UIGraphicGetCurrentContext(); 

그런 다음 당신이 만드는 그 컨텍스트를 사용하여 CGContextRef가 얻을 것이라고 말했다 당신이 그 레이어에 그리려는 경우에, 당신은 CGLayer

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

로 레이어에서 가져온 컨텍스트로 그릴 수 있습니다. (CGLayer를 생성하기 위해 이전에 전달한 컨텍스트와 약간 다릅니다.) Im은 CGLayerCreateWithContext을 추측하여 전달 된 컨텍스트에서 얻을 수있는 정보를 저장하지만 모든 정보는 저장하지 않습니다. (예제 중 하나는 ColorSpace 정보이므로 CGLayer의 컨텍스트로 내용을 채울 때 다시 지정해야합니다.

CGLayerGetContext() 함수에서 CGLayer 컨텍스트 참조를 가져 와서 그릴 수 있습니다.

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

내가 알아 낸 한 가지 점은 화면에서 무언가를 그릴 때 화면 밖으로 물건을 자동으로 잘라내는 것입니다. (의미가 있으므로 보이지 않는 것들을 그립니다.)하지만 (매트릭스 변환을 사용하여) 레이어를 움직일 때. 클리핑 된 경로가 표시되지 않습니다 (누락). 당신이 변수로 레이어에 대한 참조를 저장하고 나중에 그것을 그릴하려는 경우

마지막으로 한가지, 당신은 사용할 수 있습니다 CGContextDrawLayerAtPoint() 방법 그것은 "stampt"또는 "의 정렬합니다

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

같은 그 newPointX와 새로운 PointY 좌표에서 레이어를 그립니다.

질문에 대한 답변을 바랍니다. 알려 주시면 알려주세요.

+0

나는 또한 CGLayer 문제로 인해 붙어있어, 내 touchedmoved 함수에 쓰는 방법을 이해하지 못한다. 제 게시글을보실 수 있습니까? http://stackoverflow.com/questions/11341763/how-to- use-cglayer-for-optimal-drawing – Ranjit

+0

CGContextBeginPath() 및 CGContextClosePath()는 컨텍스트의 매개 변수를 사용합니다. – Ant

관련 문제