2012-01-08 25 views
1

我有一个大UIScrollView含有CATiledLayer我用画的更大的地砖这drawRect:这样的:CATiledLayer,CGContextDrawImage和CGContextTranslateCTM

- (void)drawRect:(CGRect)rect { 
    int firstCol = floorf(CGRectGetMinX(rect)/tileSize); 
    int lastCol = floorf((CGRectGetMaxX(rect)-1)/tileSize); 
    int firstRow = floorf(CGRectGetMinY(rect)/tileSize); 
    int lastRow = floorf((CGRectGetMaxY(rect)-1)/tileSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextTranslateCTM(context, 0, tileSize); 
CGContextScaleCTM(context, 1.0, -1.0); 

    for(int row = firstRow; row <= lastRow; row++) { 
    for(int col = firstCol; col <= lastCol; col++) { 
      UIImage = [self getTileWithRow:row column:col]; 

      CGRect tileRect = CGRectMake((col * tileSize), 
             row * tileSize), 
             tileSize, tileSize); 

      CGContextTranslateCTM(context, 0, tileRect.size.height); 
      CGContextScaleCTM(context, 1.0, -1.0); 
      CGContextDrawImage(context, tileRect, tile.CGImage); 
     } 
    } 

    CGContextRestoreGState(context); 
} 

当我注释掉CGContextSaveGState这工作, CGContextSaveGState,CGContextScaleCTMCGContextRestoreGState调用,但图像颠倒。通过调用,图像根本不会被绘制。我可以使用[tile drawInRect:],但是会反向绘制行,从而将较大的图像拧紧。

我在做什么错误的翻译?

编辑:按照建议移动保存/恢复并转换出循环,但它仍然没有绘制任何东西。

回答

4

设置权转换翻转内容垂直异常困难。没有看到任何东西的可能原因是因为转换将图像移动到矩形之外。我之前做过这件事,但不记得我是如何做到的。现在我在CATiledLayer上设置了“geometryFlipped = YES”,它为我做了翻转。顺便说一下,为什么不将CATiledLayer的“tileSize”设置为你的瓷砖的大小,那么你不需要这个for-loop瓷砖贴图的东西。 drawRect被调用一次为每个瓷砖,所以你可以这么做:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    int col = floorf(CGRectGetMinX(rect)/tileSize); 
    int row = floorf(CGRectGetMinY(rect)/tileSize); 

    UIImage tile = [self getTileWithRow:row column:col]; 

    CGContextDrawImage(context, rect, tile.CGImage); 
} 
+0

我没有意识到有一个geomtryFlipped属性,这已经帮助了很多,谢谢。我还更新了tileSize以减少代码并消除循环,并且它看起来很棒。 – JWood 2012-01-09 15:11:09

2

首先,将所有CGContextSaveGState/CGContextRestoreGState移出这些循环,因为这些会在您的实施中增加比所需更多的工作量。

其次,将CGContextRef context = UIGraphicsGetCurrentContext();添加为drawRect方法的第一行。

所以您的实现应该是这样的美好:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextTranslateCTM(context, 0, rect.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    int firstCol = floorf(CGRectGetMinX(rect)/tileSize); 
    int lastCol = floorf((CGRectGetMaxX(rect)-1)/tileSize); 
    int firstRow = floorf(CGRectGetMinY(rect)/tileSize); 
    int lastRow = floorf((CGRectGetMaxY(rect)-1)/tileSize); 

    for(int row = firstRow; row <= lastRow; row++) 
    { 
     for(int col = firstCol; col <= lastCol; col++) 
     { 
      UIImage = [self getTileWithRow:row column:col]; 

      CGRect tileRect = CGRectMake((col * tileSize), 
             row * tileSize), 
             tileSize, tileSize); 

      CGContextDrawImage(context, tileRect, tile.CGImage); 
     } 
    } 
    CGContextRestoreGState(context); 
} 
+0

谢谢,我已经更新,包括你的建议,但它仍然没有画任何东西。这是否可以归结为它是一个CATiledLayer,并且翻译正在将坐标移动到可见矩形的外部? – JWood 2012-01-08 14:31:44