Увеличение масштаба iPhone “основанная на векторе графика” на аффинных преобразованиях

Я сделал представление "Circle" с этим drawRect

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

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

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

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

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

Спасибо.

5
задан Dan 30 January 2010 в 17:46
поделиться

3 ответа

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

При нанесении вида на iPhone -Драукрект: вызывается для подачи контента для слоя просмотра. Этот контент затем кэшируется как текстура на GPU.

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

5
ответ дан 14 December 2019 в 19:12
поделиться

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

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

0
ответ дан 14 December 2019 в 19:12
поделиться

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

0
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: