2009-12-20 3 views
2

Я переопределил drawRect: в своем UIView и хочу нарисовать несколько фрагментов. Я просматриваю их все, и у меня есть отдельная функция, которая рисует каждую отдельную плитку.Переопределение drawRect: и нажатие нового смещения CGContexts на стек

То, как я это делаю сейчас, я передаю функции плитки CGRect. В настоящий момент любые чертежные методы должны включать в себя смещения x & y прямоугольника, переданного ему при рисовании изображений плитки.

Как я могу нажать новый CGContext смещения в стеке, прежде чем вызывать методы рисования плитки?

Так, например, я мог бы нарисовать квадрат в [0, 0, 50, 50] внутри метода рисования плитки, и это действительно будет нарисовано в правильном месте плитки?

+0

Что вы имеете в виду под «нажимаете на стек»? – kiamlaluno

ответ

9

Вы должны использовать CTM (текущую матрицу преобразования), которая использует аффинные преобразования для масштабирования чертежа в контексте. Он построен именно для этой цели.

  • Первый звонок CGContextSaveGState. Это экономит кучу информации о графическом контексте на стек (для каждого контекста), включая CTM.
  • Во-вторых, используйте CGContextTranslateCTM. Перейдите в координаты x прямоугольника x & y.
  • Затем вызовите свою подпрограмму рисования.
  • Наконец, вызовите CGContextRestoreGState. Это отменит перевод.

Надеюсь, что это поможет.

+0

Отлично, это было то, что я искал! Знал, что это будет связано со стеками ;-) –

+1

Одно из возможных улучшений: вам не нужно сохранять и восстанавливать gstate вокруг каждой плитки. Вы можете 'CGContextSaveGState' перед целой строкой, переводить на tile-width точек горизонтально (и нуль по вертикали) для каждой плитки, затем' CGContextRestoreGState', чтобы вернуться в начало строки и перевести вниз на tile-height указывает, чтобы перейти к следующей строке. –

+0

Отличный трюк. CoreGraphics - такая система badass. –