Забудьте об ограничении 2000x200, у меня есть проект с открытым исходным кодом, который рисует изображения NASA 18000 x 18000.
Предлагаю вам разбить эту задачу на две части. Сначала прокрутка. Как было предложено CodaFi, при прокрутке вы предоставите CATiledLayers. Каждый из них будет создаваться CGImageRef - суб-изображение вашего действительно огромного холста. Затем вы можете легко поддерживать масштабирование.
Вторая часть взаимодействует с пользователем, чтобы рисовать или иным образом воздействовать на холст. Когда пользователь перестает прокручивать, вы затем создаете непрозрачный подкласс UIView, который вы добавляете в качестве подзаголовка к основному виду, накладывая вид на хостинг, содержащий CATiledLayers. На данный момент вам нужно показать это представление, вы заполняете его соответствующей информацией, чтобы он мог нарисовать эту часть вашего большего холста правильно (скажем, круг в этот момент такого-то цвета и т. Д.).
Вы бы сделали свой чертеж, используя метод drawRect: этот вид наложения. Так как пользователь предпринимает действия, которые меняют представление, вы делаете «setDisplayInRect:» по мере необходимости, чтобы заставить iOS вызвать ваш drawRect :.
Когда пользователь решает прокрутить, вам необходимо обновить свою большую модель холста любыми изменениями, внесенными пользователем, а затем удалить непрозрачную накладку и позволить CATiledLayers нарисовать правильные части большого изображения. Этот переход, вероятно, является самой сложной частью процесса, чтобы избежать визуальных сбоев.
Предположим, что у вас есть большой массив определений объектов, используемых для вашего холста. Когда вам нужно создать CGImageRef для плитки, вы просматриваете ее, просматривая ее наложение между фреймом объекта и фреймом плитки и только затем нарисуйте те элементы, которые необходимы для этой плитки.
Возможно, несколько CATiledLayers, застрявших в их собственном scrollView, были бы идеальны тогда. – CodaFi