Рисование множества UIBezierPaths в представлении

#ios #objective-c #cocoa-touch #quartz-graphics #uibezierpath

#iOS #objective-c #cocoa-touch #quartz-графика #uibezierpath

Вопрос:

Я рисую несколько UIBezierPath объектов в представлении, основанном на движениях пальцев.

Каждый раз, когда цикл касаний — Начался / переместился / закончился — завершается, я сохраняю точки и создаю UIBezierPath , который хранится в массиве с именем bezierArray . У меня есть другой массив с именем bezierArrayColors , который хранит цвета каждого пути.

Проблема заключается в следующем. Класс использует drawRect . Насколько я могу видеть, при каждом drawRect запуске ему приходится рисовать все пути, которые когда-либо были созданы, и приложение теперь работает медленно.

Это мое drawRect сейчас. Я знаю, что это довольно неубедительно, но я не вижу, как это можно сделать.

 - (void)drawRect:(CGRect)rect {
   for (int i=0; i<[self.bezierArray count]; i  ) {
        UIBezierPath *aPath = (UIBezierPath*)[self.bezierArray objectAtIndex:i];
        UIColor *aColor = (UIColor*)[self.bezierArrayColor objectAtIndex:i];
    [aPath setLineWidth:LINE_WIDTH];

    [aColor setStroke];
    [aPath stroke];
    }
}
  

Есть ли способ обводить UIBezierPath разными цветами или, возможно, шириной, используя подпути? Я имею в виду, изменить цвет, ширину и другие свойства подпути? Это позволило бы мне использовать один UIBezierPath с несколькими разными подпутями. Я бы хотел, чтобы один безье можно было нарисовать и оставить там без необходимости каждый раз перерисовывать. Чего мне не хватает?

Ответ №1:

Убедитесь, что вы обратили внимание на прямоугольник, который передается в -drawRect :. Если ваш код выбирает простой способ и перерисовывает все представление каждый раз, когда вызывается drawRect: , вы можете выполнять гораздо больше рисования, чем необходимо, по крайней мере, некоторое время.

Комментарии:

1. Привет @Celeb . пожалуйста, проверьте мой метод — (void)drawRect:(CGRect)rect { [brushPattern setStroke]; [Мой путь strokeWithBlendMode:kCGBlendModeHardLight alpha: 0.5];} я работаю с камерой в реальном времени. я могу успешно рисовать на live camera .. я установил несколько кнопок, чтобы изменить цвет pain brush. когда я выбираю любой из этого и начинаю снова отображать, чем предыдущий контекст, цвет краски также меняется.. итак, можете ли вы, плз, подсказать мне, как мы можем это решить? и есть ли какие-либо функции для удаления этой краски?

Ответ №2:

Нарисуйте каждый путь Безье в отдельном подвиде. Таким образом, каждый безье должен быть перерисован только тогда, когда он сам изменился.

Комментарии:

1. другого способа сделать это нет? это приведет к созданию триллионов вложенных представлений!!! а если я хочу поддерживать ластик? это не сработает.

2. Зачем вам триллион путей Безье? Вы создаете путь для каждого отдельного touchesMoved? Кроме того, если вы хотите добавить ластик, рисование в растровом изображении почти наверняка является лучшей идеей, чем сохранение путей и рисование их в drawRect.

3. каждое касание Began создает новый путь, который заканчивается на touchesended и сохраняется. У меня это работало с использованием растровых изображений, но это было довольно медленно, поэтому я пытаюсь сделать это с помощью путей.

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

5. 1 Не знаю, почему это было отклонено… это достаточно разумное предложение и, конечно же, не является неправильным, вводящим в заблуждение или иным образом неуместным.

Ответ №3:

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