iPhone - пытаюсь понять UIBezier в CGContext

Когда у меня есть UIBezier, и я запускаю его в представлении с помощью drawRect, я вижу, что Безье является своего рода изменчивым, я имею в виду, что он действительно нигде не рисуется. Вместо этого это как будто было записано в своего рода буфер, который соответствует тому, что я вижу в этом представлении. Я имею в виду, что если я снова вызову 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 или она изменчива, как и раньше? Документы не содержат никакой информации об этом и, как всегда, расплывчаты.

Благодарность


person Duck    schedule 12.06.2011    source источник
comment
Это довольно интересный вопрос, хотя мне потребовалось несколько прочтений, чтобы понять его.   -  person jscs    schedule 12.06.2011
comment
это как-то связано с тем, что английский не мой родной язык... :D   -  person Duck    schedule 12.06.2011


Ответы (2)


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

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

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

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

person jscs    schedule 12.06.2011
comment
но в моем коде, когда я глажу, где я рисую? на ctx или в представлении? - person Duck; 12.06.2011

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

person Jonathan Grynspan    schedule 12.06.2011
comment
если это так, то почему внешний вид строки меняется, если я изменяю ее свойство и записываю снова. Например: я рисую пунктирную синюю линию. Затем я пишу сплошной красной линией. Внезапно, когда я это делаю, все линии теперь сплошные, и если я напишу пунктирную линию поверх других, все остальные линии станут пунктирными. См. этот другой мой вопрос... title="iphone перебирает массив uibezierpaths с разными атрибутами в cgcont">stackoverflow.com/questions/6318972/ - person Duck; 12.06.2011
comment
Код в этом вопросе довольно странный. Я предлагаю вам узнать больше о Quartz на веб-сайте Apple. - person Jonathan Grynspan; 12.06.2011