2012-09-14 23 views
12

Próbuję przekonwertować poszczególne strony PDF na PNG tutaj i działało idealnie, aż UIGraphicsGetCurrentContext nagle zaczął zwracać zero.UIGraphicsGetCurrentContext wydaje się zwracać zero

Próbuję odtworzyć moje kroki tutaj, ale nie jestem całkiem pewien, że wiem, w którym momencie to się stało. Moja ramka nie ma wartości 0, co, jak widzę, może spowodować ten problem, ale poza tym wszystko "wygląda" poprawnie.

Oto początek mojego kodu.

_pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)_pdfFileUrl); 
CGPDFPageRef myPageRef = CGPDFDocumentGetPage(_pdf, pageNumber); 
CGRect aRect = CGPDFPageGetBoxRect(myPageRef, kCGPDFCropBox); 
CGRect bRect = CGRectMake(0, 0, height/(aRect.size.height/aRect.size.width), height); 
UIGraphicsBeginImageContext(bRect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context); 

Ktoś ma pojęcie, co jeszcze może powodować kontekst zerowy?

Odpowiedz

2

Rzeczywiście istnieje możliwość ponownego użycia obiektu CGContextRef po jego ustawieniu w metodzie drawRect. Chodzi o to, że musisz przenieść kontekst do stosu, zanim użyjesz go z dowolnego miejsca. W przeciwnym razie, aktualny kontekst będzie 0x0
1. Dodaj

@interface RenderView : UIView { 
    CGContextRef visualContext; 
    BOOL renderFirst; 
} 


2. W swojej @implementation najpierw ustawić renderFirst TRUE przed pogląd pojawił się na ekranie, a następnie:

-(void) drawRect:(CGRect) rect { 
    if (renderFirst) { 
     visualContext = UIGraphicsGetCurrentContext(); 
     renderFirst = FALSE; 
    } 
} 


3 Rendering Coś do kontekstu po ustawieniu kontekstu.

-(void) renderSomethingToRect:(CGRect) rect { 
    UIGraphicsPushContext(visualContext); 
    // For instance 
    UIGraphicsPushContext(visualContext); 
    CGContextSetRGBFillColor(visualContext, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(visualContext, rect); 
} 


Oto przykład dokładnie dopasowane sprawy Temat:

- (void) drawImage: (CGImageRef) img inRect: (CGRect) aRect { 
    UIGraphicsBeginImageContextWithOptions(aRect.size, NO, 0.0); 
    visualContext = UIGraphicsGetCurrentContext(); 
    CGContextConcatCTM(visualContext, CGAffineTransformMakeTranslation(-aRect.origin.x, -aRect.origin.y)); 
    CGContextClipToRect(visualContext, aRect); 
    CGContextDrawImage(visualContext, aRect, img); 
    // this can be used for drawing image on CALayer 
    self.layer.contents = (__bridge id) img; 
    [CATransaction flush]; 
    UIGraphicsEndImageContext(); 
} 


i rysunek obraz z kontekstu, która została podjęta wcześniej w tym poście:

-(void) drawImageOnContext: (CGImageRef) someIm onPosition: (CGPoint) aPos { 
    UIGraphicsPushContext(visualContext); 
    CGContextDrawImage(visualContext, CGRectMake(aPos.x, 
        aPos.y, someIm.size.width, 
        someIm.size.height), someIm.CGImage); 
} 

Nie wywołuj funkcję UIGraphicsPopContext(), dopóki nie potrzebujesz kontekstu do renderowania twoich obiektów.
Wygląda na to, że CGContextRef jest automatycznie usuwany z góry stosu graficznego po zakończeniu wywołania metody.
W każdym razie, ten przykład wydaje się być rodzajem Hack - nie planowanym i proponowanym przez Apple. Rozwiązanie jest bardzo niestabilne i działa tylko z bezpośrednimi wywołaniami metod w obrębie tylko jednego interfejsu UIView znajdującego się na górze ekranu. W przypadku wywołań "performselection", Kontekst nie wyświetla żadnych wyników na ekranie. Sugeruję więc używanie CALayera jako renderowania do celu ekranowego zamiast bezpośredniego użycia kontekstu graficznego.
Mam nadzieję, że to pomaga.

28

Czy wywołujesz metodę UIGraphicsGetCurrentContext() w metodzie drawRect? O ile mi wiadomo, można go wywołać tylko w drawRect, w przeciwnym razie po prostu zwróci zero.

+0

Tak, to pytanie zostało już kilkakrotnie odebrane na Stack Overflow! – borrrden

+0

Nadal nie jestem pewien, co jest przyczyną tego problemu, ale użyłem cudzego pliku PDF do tworzenia klas zdjęć tutaj i to naprawiło. Również używa UIGraphicsGetCurrentContext bez tego, że jest w drawRect, i działa tam dobrze. –

+0

@borrrden Czy możesz podać mi linki do podobnych pytań? – allenlinli

34

Nie trzeba jej wywoływać z "drawRect". można również nazwać po "UIGraphicsBeginImageContext (bRect.size);"

Sprawdź w następujący wiersz

UIGraphicsBeginImageContext(bRect.size); 

jeśli bRect.size nie 0,0

jest w moim przypadku to był powód, dlaczego wrócił kontekst na następnej linii była zerowa.

+3

Tak, mój problem polegał na tym, że rozmiar to CGSizeZero – ninjaneer

Powiązane problemy