2011-08-05 20 views
9

Bazı CG çizim işlemlerini bir MKMapOverlayView için oluşturduğum bir CGContext'e gerçekleştiriyorum. Bağlamı çizdikten sonra, bir resim oluşturup MapKit'in sağladığı içeriğe yapıştırıyorum.CGContext'i başka bir CGContext'e kopyalayın

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { 
    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myContext = CGBitmapContextCreate(NULL, kTileSize, kTileSize, 8, 0, colorRef, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colorRef); 
    CGContextSetAllowsAntialiasing(myContext, TRUE); 
    //...cut out drawing operations... 
    CGImageRef image = CGBitmapContextCreateImage(myContext); 
    CGContextDrawImage(context, [self rectForMapRect:mapRect], image); 
    CGImageRelease(image); 
    CGContextRelease(myContext); 
} 

bir görüntü oluşturmak zorunda kalmadan sadece context içine myContext kopyalamak için bir yolu var mı?

Bazılarınızın "neden doğrudan MapKit'in sağladığı içeriğe bakmadığını" söyleyeceğinin farkındayım. Maalesef, doğrudan context'a girerken bir çizim hatası yaşıyoruz. Apple şu anda bizim için bu sorunu araştırıyor, ancak bu arada yerinde bir çözüm bulmamız gerekiyor. Yukarıda sunduğum bu geçici çözüm benim "en iyi" çekimim, ama yavaş tarafta biraz.

P.S. Burada da bir cevap aradığımdan beri bir ödül verdim. Özellikle de OS X'i hedefliyorum. Bu yüzden cevap orada çalışmalı. OP, iOS'ta bir cevap arıyordu.

+0

Sorun için uygun bir çözüm buldunuz mu? Şu anda aynı sorunla karşı karşıyayım ... – Georg

+0

Ne yazık ki ... CGFloat'ın 64 bitlik IOS aygıtlarında bir "çift" olduğu gerçeğine rağmen, büyük tam sayı ve daha büyük kesir, Harita kayasına çok küçük değişiklikler yapılması. –

cevap

1

CGLayerRef'i kullanabilirsiniz. Katman ref, bir dizi çizim yaptığınız alt bağlam gibidir ve daha sonra katmanın içerik değerini çizmeyi bitirdiğinizde orijinal içeriğin içine doğru düzleşir.

Genellikle, her bir çağrıdan ziyade birçok çizim çağrısında paylaşılan alfa veya gölgeleri almak için kullanılır.

Bu, karşılaştığınız her hangi bir hata için ya da performansın iki bağlam yaklaşımından daha iyi ya da daha kötü olup olmadığı konusunda hala bir çözüm olup olmayacağını bilmiyorum. Hedefleriniz ve ihtiyaçlarınız hakkında daha fazla bilgiye ihtiyacım var. Örneğin, ikinci bir kopyadan kaçınmak için iki bağlamı kullanmaktan mı yoksa ikinci resmin belleğini ödemek istemediğinizden mi kaçınmak istersiniz?