Увеличение масштабов «векторной графики» на iPhone с помощью аффинных преобразований - PullRequest
5 голосов
/ 30 января 2010

Я сделал вид "Круг" с этим drawRect

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

    CGContextSetFillColorWithColor(ctx, color.CGColor);
    CGContextAddEllipseInRect(ctx, rect);
    CGContextFillPath(ctx);
}

Когда я пытаюсь увеличить изображение, используя CGAffineTransformMakeScale(2.0, 2.0), результат получается размытым и с пиксельными краями. Однако в руководстве по программированию сказано, что Quartz использует векторные команды для рисования представлений и что они будут хорошо выглядеть при использовании аффинных преобразований:

Система рисования Quartz использует векторную модель рисования. По сравнению с растровой моделью рисования, в которой команды рисования работают с отдельными пикселями, команды рисования в Quartz задаются с использованием пространства рисования фиксированного масштаба, известного как пространство пользовательских координат. Затем iPhone OS отображает координаты в этом пространстве рисования на фактические пиксели устройства. Преимущество этой модели состоит в том, что графика, нарисованная с использованием векторных команд, продолжает хорошо выглядеть при увеличении или уменьшении с использованием аффинного преобразования .

Или я не использую векторные команды? Если нет, то как бы я сделал это, чтобы нарисовать круг?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 31 января 2010

Применение преобразования к представлению не приводит к его перерисовке. Все, что он делает, это масштабирует слой представления, который является растровой текстурой, хранящейся в графическом процессоре. Это приведет к размытой графике.

При рисовании представления на iPhone вызывается -drawRect: для предоставления содержимого для слоя представления. Затем этот контент кэшируется как текстура в графическом процессоре.

То, на что они ссылаются в руководстве, - это применение преобразования во время -drawRect:, когда рисуется векторная графика. Если вы используете преобразование там (через CGContextConcatCTM() или подобное), круг будет нарисован плавно в большем масштабе. Тем не менее, вам также нужно изменить размер вашего представления, чтобы отразить эту большую форму. Я рекомендую использовать свойство scale в вашем подклассе пользовательского представления, для которого вы можете установить другой масштабный коэффициент, который будет обрабатывать изменение размера представления и резкую перерисовку его содержимого.

0 голосов
/ 30 января 2010

Вы можете попробовать позвонить setNeedsDisplay после преобразования, я не уверен, сработает ли это или нет, но стоит попробовать.

0 голосов
/ 30 января 2010

Я полагаю, это зависит от того, когда вы применяете преобразование масштабирования. Если вы сначала нарисуете его, а затем выполните масштабное преобразование, то оно будет выглядеть точечно (поскольку оно было масштабировано после рисования). Если вы сделаете шкалу до того, как начнете рисовать, я ожидаю, что она будет работать так, как ожидалось.

Так что да, вы используете векторные команды для достижения этой цели; Я подозреваю, что это проблема заказа. Когда вы делаете трансформацию и рисование?

...