Читаем iOS. Приемы программирования полностью

Функции преобразования масштаба принимают два параметра: масштабирование по оси X и масштабирование по оси Y. Еще раз обратимся к прямоугольнику с рис. 17.22. Если мы хотим масштабировать этот прямоугольник, чтобы его исходные длина и ширина уменьшились вполовину, то можно просто масштабировать по оси X и Y на 0,5 (вполовину от исходного значения), как показано здесь:


/* Масштабируем прямоугольник, уменьшая его на половину. */

CGAffineTransform transform =

CGAffineTransformMakeScale(0.5f, 0.5f);


/* Добавляем прямоугольник к пути. */

CGPathAddRect(path,

&transform,

rectangle);


На рис. 17.31 показано, что получится, когда мы применим преобразование масштаба к коду, написанному в разделе 17.8.


Рис. 17.31. Масштабирование прямоугольника


Дополнительно к функции CGAffineTransformMakeScale можно использовать процедуру CGContextScaleCTM, помогающую применить преобразование масштаба к графическому контексту. Следующий код даст тот же эффект, что и в предыдущем примере (вновь обратите внимание на рис. 17.31):


— (void)drawRect:(CGRect)rect{


/* Сначала создаем путь. Просто описатель пути. */

CGMutablePathRef path = CGPathCreateMutable;


/* Это границы прямоугольника. */

CGRect rectangle = CGRectMake(10.0f,

10.0f,

200.0f,

300.0f);


/* Добавляем прямоугольник к пути. */

CGPathAddRect(path,

NULL,

rectangle);


/* Получаем описатель текущего контекста. */

CGContextRef currentContext = UIGraphicsGetCurrentContext;


/* Масштабируем все фигуры, отрисованные в графическом контексте,

уменьшая их на половину. */

CGContextScaleCTM(currentContext,

0.5f,

0.5f);


/* Добавляем путь к контексту. */

CGContextAddPath(currentContext,

path);


/* Задаем голубой в качестве цвета заливки. */

[[UIColor colorWithRed:0.20f

green:0.60f

blue:0.80f

alpha:1.0f] setFill];


/* Задаем для обводки коричневый цвет. */

[[UIColor brownColor] setStroke];


/* Задаем для ширины (обводки) значение 5. */

CGContextSetLineWidth(currentContext,

5.0f);


/* Проводим путь в контексте и применяем к нему заливку. */

CGContextDrawPath(currentContext,

kCGPathFillStroke);


/* Избавляемся от пути. */

CGPathRelease(path);


}

См. также

Раздел 17.11.

17.13. Вращение фигур, нарисованных в графических контекстах

Постановка задачи

Требуется иметь возможность вращать содержимое, отрисованное в графическом контексте, не изменяя при этом код отрисовки.

Решение

Воспользуйтесь функцией CGAffineTransformMakeRotation для создания аффинного преобразования вращения.

Обсуждение

Перед тем как приступать к работе с этим разделом, настоятельно рекомендую вам перечитать материал из разделов 17.11 и 17.12. Чтобы сократить текст, я старался не дублировать в последующих разделах материал, уже изложенный в предыдущих.

Точно так же, как при масштабировании и сдвиге, мы можем применять преобразование вращения к фигурам, отрисованным на путях и прямо в графическом контексте. Можно использовать функцию CGAffineTransformMakeRotation и сообщать значение вращения в радианах, а в качестве возвращаемого значения получать преобразование вращения типа CGAffineTransform. Затем это преобразование можно применять к путям и фигурам. Если вы хотите повернуть весь контекст на определенный угол, используйте процедуру CGContextRotateCTM.

Повернем прямоугольник, изображенный на рис. 17.22, на 45° по часовой стрелке (рис. 17.32). Значение, полученное в результате вращения, должно быть выражено в радианах. Положительные значения дают вращение по часовой стрелке, а отрицательные — против часовой:


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже