首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止绘制CATiledLayer

停止绘制CATiledLayer
EN

Stack Overflow用户
提问于 2010-10-06 18:23:46
回答 6查看 6.9K关注 0票数 10

是否可以停止CATiledLayer来绘制(drawLayer:inContext)?它是异步绘制的,当我尝试释放CATiledLayer使用的CGPDFDocumentRef时,应用程序崩溃(EXC_BAD_ACCESS)。

这就是我的观点:

代码语言:javascript
复制
@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];
}

这就是我尝试在视图控制器中停止并发布PDF的地方:vTiledPDFView的实例

代码语言:javascript
复制
 -(void) stopDwaring {
     [v stopDrawing];
     [v removeFromSuperview];
     [v release];
     [self.view removeFromSuperview];
     self.view = nil;
     CGPDFDocumentRelease(pdf);

 }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-23 05:07:20

这篇文章帮助我解决了我自己的CATiledLayer问题。我使用了Apple文档中的TiledPDFview.m作为示例。因为我需要在某个时刻重画整个视图和所有的瓦片,所以我使用CATiledLayer作为属性。当退出和释放视图控制器时,它崩溃了,并将CATiledLayer retain:消息发送到已释放的实例。下面是我的视图控制器的dealloc方法:

代码语言:javascript
复制
- (void)dealloc {
    self.tiledLayer.contents=nil;
    self.tiledLayer.delegate=nil;
    [self.tiledLayer removeFromSuperlayer];

    // note: releasing the layer still crashes- 
    // I guess removeFromSuperlayer releases it already, 
    // but couldn't find documentation so far.
    // So that's why it's commented out:
    // [self.tiledLayer release], self.tiledLayer=nil;

    //release the other viewcontroller stuff... 
    [super dealloc];
}

这对我很有效。希望这能帮助到别人。

票数 9
EN

Stack Overflow用户

发布于 2010-10-06 19:07:49

在释放CGPDFDocumentRef之前,将CATiledLayer从其上层移除。

代码语言:javascript
复制
[yourTiledLayer removeFromSuperlayer];

别忘了把它的委派也设为零。

代码语言:javascript
复制
yourTiledLayer.delegate = nil;

在此之后,您可以安全地释放您的CGPDFDocumentRef。

添加代码后编辑:

你用CGPDFDocumentGetPage()得到pdfPage了吗?如果是这样,你就不应该释放它,它是一个自动释放的对象。

关于如何将其添加为子层:您实际上不需要TiledPDFView。在视图控制器中,您可以简单地执行以下操作:

代码语言:javascript
复制
CATiledLayer *tiledLayer = [CATiledLayer layer];
tiledLayer.delegate = self; //sets where tiledLayer will look for drawLayer:inContext:
tiledLayer.tileSize = CGSizeMake(512.0f, 512.0f);
tiledLayer.levelsOfDetail = 4;
tiledLayer.levelsOfDetailBias = 4;
tiledLayer.frame = CGRectIntegral(CGRectMake(0.0f, 0.0f, 512.0f, 512.0f));
[self.view.layer addSublayer:tiledLayer];

然后将您的drawLayer:inContext:实现移动到您的视图控制器。

然后在视图控制器的dealloc中,将其释放为:

代码语言:javascript
复制
[tiledLayer removeFromSuperlayer];
tiledLayer.delegate = nil;
CGPDFDocumentRelease(pdf);

请注意,您不能在UIView子类上执行此操作,因为UIView:inContext:将与UIView的主层冲突。

票数 3
EN

Stack Overflow用户

发布于 2010-11-17 19:14:30

object.layer.contents =零

这应该等待线程完成。这对我的情况很有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3871524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档