iPhone - пытаясь понять UIBezier в CGContext - PullRequest
1 голос
/ 12 июня 2011

Когда у меня есть UIBezier, и я создаю его на виде с помощью drawRect, я вижу, что bezier является своего рода изменчивым, я имею в виду, он действительно нигде не рисуется.Вместо этого это похоже на то, что оно было записано в виде буфера, который соответствует тому, что я вижу в этом представлении.Я имею в виду, что если я снова вызову drawRect с помощью [self setNeedsDisplay], Безье исчезнет, ​​и я смогу написать другие вещи.

С другой стороны, если я рисую подобное на CGContext, используя

CGContextStrokePath(ctx);

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

Но чтопроисходит, когда я использую команду UIBezier для записи в CGContext?

Я имею в виду, если я делаю что-то вроде

UIGraphicsPushContext(ctx);
CGContextSaveGState(ctx);
CGContextTranslateCTM(ctx, 0, height);
CGContextScaleCTM(ctx, 1.0, -1.0);
[myBezier stroke];
CGContextRestoreGState(ctx);
UIGraphicsPopContext();

, эта строка постоянно записывается в ctx или она изменчива, как раньше?Документы не содержат никакой информации об этом и, как всегда, расплывчаты.

спасибо

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Всякий раз, когда вызывается drawRect: вашего представления, UIKit устанавливает графический контекст, в который вы можете рисовать. Вот почему кажется, что пути Безье не являются постоянными; каждый раз, когда необходимо отобразить представление, появляется новый новый контекст, и ваши пути вовлекаются в него. Поэтому каждый раз через drawRect: вы можете не рисовать конкретный путь, и он не будет отображаться.

Нет способа удалить путь после того, как он был добавлен в контекст, но в следующий раз, когда представление обновляется, появляется новый контекст, в котором почти ничего нет. Если вы создаете свой собственный графический контекст, все, что вы помещаете в него, является «постоянным» - оно будет там на протяжении всего жизненного цикла.

Контекст в основном состоит из инструкций рисования, которые создадут «картинку». Это расплывчато, потому что местом назначения контекста - где будет нарисована картинка - могут быть разные вещи: файл изображения, часть экрана устройства, возможно, даже лист бумаги. Контекст, как только он полон инструкций для рисования, затем визуализируется по назначению.

В случае вашего вида чертежа UIKit устанавливает этот контекст для вас и вызывает ваш drawRect:. Здесь есть определенная степень косвенности - вы никогда не «входите в представление», всегда в контекст. Ваш вид по существу резервирует и представляет часть экрана. UIKit спросит вас, что вы хотели бы поместить в этот раздел, и предоставит вам графический контекст, чтобы вы могли передать эту информацию. Затем он берет контекст, который полон инструкций, превращает его в данные пикселей и рисует их в области, представленной вашим видом.

1 голос
/ 12 июня 2011

UIBezierPath - это класс, который включает в себя серию линий / кривых и инструкции по их рисованию. Когда вы рисуете контур Безье, он по сути делает то же самое, что и любая другая функция рисования в Кварце. Содержимое контекста будет сохраняться в течение всего времени существования контекста (для контекста растрового изображения это время жизни растрового изображения в памяти; для контекста представления это «до тех пор, пока представление не должно быть перерисовано».)

...