Производительность iOS UIImage.drawInRect (CGContextDrawImage) - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение, которое позволяет пользователю манипулировать такими элементами, как текст, изображения, фигуры (векторные изображения). Они накладываются друг на друга, как слои в Photoshop.

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

Я использую drawInRect, чтобы нарисовать все мои предметы. К сожалению, при рисовании изображений я вижу очень низкую производительность - это вывод после проверки кода с помощью профилировщика.

Из того, что я читал в Интернете, люди рекомендуют использовать отдельный UIView (UIImageView) для всего изображения и обычный drawInRect для других элементов в отдельном представлении.

Но такой подход был бы проблематичным, потому что у меня может быть такая ситуация:

  • 2 слоя сзади с текстом
  • 1 слой с изображением - препятствующая часть текста
  • 2 слоя спереди с текстом сверху изображения

Это означало бы, что мне нужно будет сделать UIView для первых 2 текстовых слоев, UIImageView для среднего изображения и еще UIView для передних элементов. Это кажется неразумным.

Как повысить производительность рисования моего изображения?

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

ПРИМЕЧАНИЕ: где я упоминаю слой, я не имею в виду CALayer.

1 Ответ

0 голосов
/ 02 мая 2018

Используйте метод, подобный этому, чтобы нарисовать то, что вы хотите:

func drawSomeImage(completion: (UIImage) -> Void) {

        UIGraphicsBeginImageContextWithOptions(<#T##size: CGSize##CGSize#>, <#T##opaque: Bool##Bool#>, <#T##scale: CGFloat##CGFloat#>)

        //Your drawing...

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
       completion(image)
}

И сделать вышеупомянутые строки в потоке из основного потока, как это:

 func myImage() {

        DispatchQueue.global().async {


          drawSomeImage { image in


            DispatchQueue.main.async {

               //use this image in your main thread like:
              //self.imageView.image = image

           }

         }

        }
...