-renderInContext:
широко используется с момента его появления, но при этом невозможно отобразить слой OpenGL, AVPreviewLayer (возможно, потому что это своего рода слой OpenGL), и я все еще не смог правильно отобразить CATiledLayer.
В iOS7 были введены 2 новых API для получения скриншотов, один из них - -snapshotViewAfterScreenUpdates:
, который возвращает определенный вид (_UIReplicantView
) и -drawViewHierarchyInRect:afterScreenUpdates:
, последний из которых является своего рода заменой для -renderInContext
, к сожалению, похоже, ограничения.
-snapshotViewAfterScreenUpdates: он, похоже, работает также с OpenGL и AVPreviewLayer, к сожалению, подобное подобное представление не очень полезно, если вы хотите делать определенные анимации или использовать содержимое в качестве фона чего-то (например, uibutton). Я попытался удалить содержимое из возвращаемого представления, но мне все равно не повезло.
Кто-нибудь еще пытался?
_UIReplicantView и snapshotViewAfterScreenУдаляет, как получить свой контент?
Ответ 1
Я столкнулся с этой проблемой, сначала мы работали над ней, подключившись к NSRunLoop и визуализируя изображение, а затем объединив их. Это было действительно грязно.
Затем мы обнаружили фрагмент кода, который, по-видимому, решил бы эту проблему, но вы должны быть готовы немного подумать за пределами коробки.
В этой структуре записывается видео с UIWindow, тогда мы просто останавливаем запись. Перетаскивая его через AVAssetImageGenerator (или что-то в этом роде) и захватывая изображение.
Как я уже говорил, это очень странный способ решить эту проблему, но, похоже, для нас это хорошо.
Код для (ASScreenRecorder) можно найти в этой библиотеке здесь.
https://github.com/alskipp/ASScreenRecorder
Одним из наших меню в нашем продукте был OpenGL, а у некоторых были видеоролики! И это отлично сработало для нас. Но я не могу быть уверенным, было ли это чем-то особенным для нашей реализации и использования OpenGL. Это определенно работает для просмотра камеры, хотя в качестве примера демонстрируется видео.