Я работаю над приложением, которое использует представление с поддержкой CATiledLayer в UIScrollView, чтобы пользователь мог работать на произвольно большом холсте. Холст в основном содержит большую диаграмму блоков, которые пользователь может раскрашивать, выбирать, перемещать и т. д. Я заменяю draw(_ rect: CGRect), чтобы рисовать в представлении.
Все это работает нормально - CATiledLayer действительно хорошо работает, чтобы снизить потребление памяти, пока пользователь работает над своим графиком. Прокрутка и масштабирование отлично работают.
Теперь мне нужно разрешить пользователю экспортировать копию своей диаграммы в фотопленку, но у меня возникают проблемы с памятью, и приложение дает сбой. Я пробовал различные методы, чтобы запечатлеть вид на изображение. Представление не полностью видно, поскольку оно находится в UIScrollView
Вот как я сейчас создаю изображение:
// MyView is the view that is used in the scrollView
static func screenshotByDrawingItAgain(_ view: MyView) -> UIImage? {
var image: UIImage?
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, UIScreen.main.scale)
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
// This is where my chart data model is stored in memory
guard let chart = view.chart else {
return nil
}
// drawInRect is also called from MyView's draw(_:) method
// so all drawing code is in one place
view.drawInRect(context, with: chart, in: view.bounds, row: 0, col: 0)
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
Поскольку диаграммы могут быть любого размера, это означает, что они могут стать довольно большими. Мне нужен способ каким-то образом экспортировать такие большие изображения. Пример ошибки:
BOUNDS (10200.0, 6360.0)
CGBitmapContextInfoCreate: unable to allocate 1037952000 bytes for bitmap data
Большинство сообщений, которые я видел, посвящены тому, как читать большие изображения (например, фотографии) и отображать их. Мне не удалось найти никакой информации о том, как сделать обратное и получить изображение вида. Есть ли способ сгенерировать меньшие плитки представления в файл, а затем сшить их вместе и предоставить им доступ к полученному файлу? Спасибо!
Поэтому я определенно мог бы использовать drawInRect для создания меньшего изображения, поскольку он принимает CGRect, а затем что-то с этим делать. Любые указатели на то, как сгенерировать файл из этого прямоугольника, а затем объединить все эти файлы в одно изображение, которое не нужно считывать обратно в память. Второй шаг кажется более проблематичным ...





вместо того, чтобы захватывать все содержимое представления в виде изображения, попробуйте захватить отдельные части, а затем объединить их в файл. Поскольку растровые изображения не сжимаются, как png или jpg, они могут занимать очень много места при таком выделении. Вроде бы сложно, но для вашей задачи оно достойно. Используйте
CGRectвместоview.bounds