2012-01-08 5 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, CGContextScaleCTM и CGContextRestoreGState звонки, но изображения перевернуты. При наличии вызовов изображение вообще не нарисовано. Я мог бы использовать [tile drawInRect:], но это рисует строки в обратном порядке, которые зажимают большее изображение.

Что я делаю неправильно с переводом?

EDIT: Перемещено сохранение/восстановление и преобразование из цикла, как было предложено, но оно все еще ничего не рисует.

ответ

4

Установка нужных преобразований, чтобы перевернуть содержимое вертикально, как известно, трудно. Вероятная причина не видеть ничего, потому что преобразования перемещают изображение за пределы прямоугольника. Я сделал это раньше, но не помню, как я это сделал. Теперь я установил «geometryFlipped = YES» на CATiledLayer, что делает перевернутость для меня.

Кстати, почему бы вам не установить значение «tileSize» для CATiledLayer на размер ваших фрагментов, тогда вам не понадобится этот материал для картографирования плитки для петли. 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

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

Смежные вопросы