Stop-Zeichnung von CATiledLayer
Ist möglich zu stoppen CATiledLayer
zu ziehen (drawLayer:inContext)?
Es zieht asynchron und wenn ich versuche zu release CGPDFDocumentRef, die CATiledLayer
stürzt die app (EXC_BAD_ACCESS).
Das ist meine Ansicht:
@implementation TiledPDFView
- (id)initWithFrame:(CGRect)frame andScale:(CGFloat)scale{
if ((self = [super initWithFrame:frame])) {
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
tiledLayer.levelsOfDetail = 4;
tiledLayer.levelsOfDetailBias = 4;
tiledLayer.tileSize = CGSizeMake(512.0, 512.0);
myScale = scale;
}
return self;
}
//Set the layer's class to be CATiledLayer.
+ (Class)layerClass {
return [CATiledLayer class];
}
- (void)stopDrawing{
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
[tiledLayer removeFromSuperlayer];
tiledLayer.delegate = nil;
}
//Set the CGPDFPageRef for the view.
- (void)setPage:(CGPDFPageRef)newPage
{
CGPDFPageRelease(self->pdfPage);
self->pdfPage = CGPDFPageRetain(newPage);
//self->pdfPage = newPage;
}
-(void)drawRect:(CGRect)r
{
}
//Draw the CGPDFPageRef into the layer at the correct scale.
-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
//First fill the background with white.
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,self.bounds);
CGContextSaveGState(context);
//Flip the context so that the PDF page is rendered
//right side up.
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
//Scale the context so that the PDF page is rendered
//at the correct size for the zoom level.
CGContextScaleCTM(context, myScale,myScale);
CGContextDrawPDFPage(context, pdfPage);
CGContextRestoreGState(context);
}
//Clean up.
- (void)dealloc {
CGPDFPageRelease(pdfPage);
[super dealloc];
}
Und das ist, wo ich versuche, Sie zu stoppen und freigeben von PDF-in-view-controller:
v
ist Instanz von TiledPDFView
-(void) stopDwaring {
[v stopDrawing];
[v removeFromSuperview];
[v release];
[self.view removeFromSuperview];
self.view = nil;
CGPDFDocumentRelease(pdf);
}
- Bitte Bearbeiten Sie Ihre Frage zum zählen der crash-log für den Absturz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
dieser Beitrag hat mir geholfen, die Lösung meiner eigenen Probleme mit CATiledLayer. Ich verwendet TiledPDFview.m von der Apple-Dokumentation als Beispiel.
Da Brauch ich neu, die gesamte Ansicht und alle Fliesen an einem gewissen Punkt, ich benutze ein CATiledLayer als Eigentum.
Beim beenden und freigeben der viewcontroller, stürzte Sie mit [CATiledLayer behalten]: Nachricht gesendet, um die Zuordnung aufgehoben Instanz.
Hier ist mein dealloc-Methode des view-Controllers:
Das funktioniert für mich. Hoffe, es hilft jemand.
retain
ist, wäre es kein Wunder, dass[self.tiledLayer release], self.tiledLayer=nil;
abgestürzt: die Linie würde über-release das Objekt. Jetzt ist es nur durchgesickert...Entfernen Sie die CATiledLayer von seiner superlayer vor der Freigabe des CGPDFDocumentRef.
Vergessen Sie nicht, um es delegieren zu null zu.
Danach können Sie sicher lassen Sie Ihre CGPDFDocumentRef.
Bearbeiten nach der OP fügt den code:
Hast du pdfPage mit
CGPDFDocumentGetPage()
? Wenn dem so ist, sollte man nicht loslassen, es ist ein autoreleased-Objekt.Darüber, wie man zu fügen Sie es als Unterebene:
Braucht man eigentlich nicht TiledPDFView. In Ihrer view-controller, können Sie einfach tun Sie dies:
Dann bewegen Sie Ihre drawLayer:inContext: Umsetzung auf Ihre view-controller.
Dann in Ihrer view-controller ist dealloc, die Freigabe als:
Beachten Sie, dass können Sie nicht tun dies auf einer UIView-Unterklasse, da die drawLayer:inContext:, im Konflikt mit der UIView main-Ebene.
Objekt.Schicht.Inhalt = Nil
Diese sollten warten, bis der thread fertig zu stellen. Es half in meinem Fall.
TiledPDFView *pdfView;
In dealloc von pdfView die superview-Klasse schreiben, die folgende Zeile des codes.
Dies funktioniert für mich. Hoffe, es wird helfen.
Ich habe ein ähnliches problem hatte.
Ich landete Einstellung eine float-variable "zoom" in meinem TiledPDFView, die ich als zoomScale von PDFScrollView in der UIScrollview Delegieren Methode: scrollViewDidZoom
Dann in meinem drawLayer Methode innerhalb TiledPDFView ich nur den Inhalt der Methode, wenn der float-Variablen "zoom" wurde auf über 2.
Dies behebt alle Probleme von jemand verlassen Sie die Ansicht ohne Zoom. Es kann nicht sein, ideal für Ihren Fall, da diese Fehler immer noch Auftritt, wenn jemand zoomt über 2 gibt dann den viewcontroller schnell, aber Sie könnten in der Lage sein zu finden, eine ähnliche Technik, um alle Grundlagen abzudecken.
Es sieht aus wie Sie tun, die gleiche Sache, die ich bin, die Kreditaufnahme, die ZoomingPDFView code und integrieren Sie in Ihr Projekt. Wenn Ihr UIScrollView delegate-Methoden in PDFScrollView unverändert geblieben sind, können Sie Ihr problem lösen, indem kommentiere einfach die beiden Leitungen Ihres dealloc-Methode hinzu (in TiledPDFView). Das Zeug sollte nur geschehen, wenn Sie töten die übergeordnete Sicht, sowieso.