Мне интересно, как мое приложение для iPhone может сделать снимок экрана определенного UIView
как UIImage
.
Я попробовал этот код, но все, что я получаю, это пустое изображение.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
имеет размеры 320х480 и имеет несколько видов. Как правильно это сделать?
ios
objective-c
uiview
screenshot
cduck
источник
источник
Ответы:
Я думаю, что вы можете хотеть
renderInContext
, нетdrawInContext
. drawInContext - это больше метод, который вы бы переопределили ...Обратите внимание, что он может работать не во всех видах, в частности, год или около того назад, когда я пытался использовать его с просмотром с камеры в реальном времени, он не работал.
источник
В iOS 7 появился новый метод, который позволяет рисовать иерархию представлений в текущем графическом контексте. Это может быть использовано для очень быстрого получения UIImage.
Я реализовал метод категории,
UIView
чтобы получить представление какUIImage
:Это значительно быстрее, чем существующий
renderInContext:
метод.Ссылка: https://developer.apple.com/library/content/qa/qa1817/_index.html
ОБНОВЛЕНИЕ ДЛЯ SWIFT : расширение, которое делает то же самое:
ОБНОВЛЕНИЕ ДЛЯ SWIFT 3
источник
Вам нужно захватить ключевое окно для скриншота или UIView. Вы можете сделать это в Retina Resolution с помощью UIGraphicsBeginImageContextWithOptions и установить его масштабный параметр 0.0f. Это всегда захватывает в родном разрешении (сетчатка для iPhone 4 и позже).
Этот делает полный скриншот экрана (ключевое окно)
Этот код захватывает UIView в родном разрешении
Это сохраняет UIImage в формате jpg с 95% качеством в папке документов приложения, если вам нужно это сделать.
источник
iOS7 и далее, у нас есть ниже методы по умолчанию:
Вызов метода выше выполняется быстрее, чем попытка визуализировать содержимое текущего представления в растровое изображение самостоятельно.
Если вы хотите применить графический снимок, например размытие, к снимку, используйте
drawViewHierarchyInRect:afterScreenUpdates:
вместо этого метод.https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
источник
Появился новый API от iOS 10
источник
Я создал полезное расширение для UIView, чтобы сделать снимок экрана в Swift:
Чтобы использовать это просто введите:
источник
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0);
а неUIGraphicsBeginImageContext(self.bounds.size);
использовать правильный масштабный коэффициент устройства.drawViewHierarchyInRect
вместоrenderInContext
не.Этот метод может поместить в ваш класс контроллера.
источник
drawRect
не является частью UIViewController (IIRC). Это часть UIView. Я не верю, что он будет вызван, если его в контроллере.Apple теперь позволяет нам использовать его в общедоступном приложении, даже если это частный API
источник
подробности
Решение
использование
Полный образец
результат
источник
Apple не позволяет:
Приложения должны делать снимок экрана, используя
drawRect
метод, указанный в: http://developer.apple.com/library/ios/#qa/qa2010/qa1703.htmlисточник
Я создал это расширение для сохранения снимка экрана из UIView
позвонить :
Если вы хотите создать PNG, необходимо изменить:
по
источник
Swift 4 обновлен:
источник
Для снятия скриншота используется следующий фрагмент:
Используйте
renderInContext:
метод вместоdrawInContext:
методаrenderInContext:
Метод визуализирует получателя и его подслои в текущий контекст. Этот метод визуализируется непосредственно из дерева слоев.источник
источник
Вы можете использовать следующую категорию UIView -
источник