Как сделать снимок экрана UIView в Swift?
У меня есть UIView с именем overView:
overView.frame = CGRectMake(self.view.frame.width/25, self.view.frame.height/25, self.view.frame.width/1.3, self.view.frame.height/1.2)
Я хочу сделать снимок экрана только этого вида, а не весь экран. И сделайте скриншот размера:
(CGSizeMake(2480,3508 )
Вот мой код:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(2480,3508 ), false, 0);
self.view.drawViewHierarchyInRect(CGRectMake(-self.view.frame.width/25, -self.view.frame.height/25,2480,3508), afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext()
Снимок экрана имеет требуемый размер, однако вместо всего лишь "overView" требуется скриншот всего представления.
Ответы
Ответ 1
Для рисования одного вида, просто используйте это:
// Begin context
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.mainScreen().scale)
// Draw view in that context
drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Если вы хотите использовать его несколько раз, возможно, расширение сделает эту работу:
//Swift4
extension UIView {
func takeScreenshot() -> UIImage {
// Begin context
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)
// Draw view in that context
drawHierarchy(in: self.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if (image != nil)
{
return image!
}
return UIImage()
}
}
//Старый Свифт
extension UIView {
func takeScreenshot() -> UIImage {
// Begin context
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale)
// Draw view in that context
drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Чтобы объяснить, что делают эти параметры:
UIGraphicsBeginImageContextWithOptions() создает временный контекст рендеринга, в который рисуется оригинал. Первый аргумент, size, является целевым размером масштабированного изображения. Второй аргумент isOpaque используется для определения, отображается ли альфа-канал. Установка этого значения в false для изображений без прозрачности (то есть альфа-канала) может привести к изображению с розовым оттенком. Третьим аргументом шкалы является коэффициент отображения масштаба. При значении 0.0 используется масштабный коэффициент основного экрана, который для дисплеев Retina составляет 2,0 или выше (3,0 на iPhone 6 Plus).
Подробнее об этом здесь http://nshipster.com/image-resizing/
Что касается розыгрыша, Apple Docs объясняет это подробно здесь и здесь
Ответ 2
быстрые 4 и iOS 10+
extension UIView {
func screenshot() -> UIImage {
return UIGraphicsImageRenderer(size: bounds.size).image { _ in
drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
}
}
}
Ответ 3
Альтернатива для ответа Алессандро, немного более краткий и быстрый стиль:
extension UIView {
var snapshot: UIImage {
return UIGraphicsImageRenderer(size: bounds.size).image { _ in
drawHierarchy(in: bounds, afterScreenUpdates: true)
}
}
}
Ответ 4
For Taking Screen Short Use This Solution. Hear I can Done How to Take Screen Short UIView with UIImage..
let img = self.captureScreen() // CaptureScreen Is A Function
let someNSDate = NSDate()
let myTimeStamp = someNSDate.timeIntervalSince1970
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
if let data = UIImageJPEGRepresentation(img, 0.8)
{
let filename = documentsDirectory.appendingPathComponent("Img_\(myTimeStamp).jpeg")
SavedImage_Ary.insert("Img_\(myTimeStamp).jpeg", at: 0) // SavedImage Is A NSMutableArray Where You Can Store your Image
//print(SavedImage_Ary)
try? data.write(to: filename)
UserDefaults.standard.setValue(SavedImage_Ary, forKey: "Saved_Image")
Save_Img = true
// self.dismiss(animated: true, completion: nil)
Select_Flag = "textdata"
let vc = self.storyboard?.instantiateViewController(withIdentifier: "photovc") as! UINavigationController
self.present(vc, animated: true, completion: nil)
}
// MARK : Function
func captureScreen() -> UIImage
{
UIGraphicsBeginImageContextWithOptions(Capture_View.frame.size, false, 0);
Capture_View.drawHierarchy(in: Capture_View.bounds, afterScreenUpdates: true)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
Ответ 5
Swift 4.x и iOS 10+ с запасным решением:
extension UIView {
func screenshot() -> UIImage {
if #available(iOS 10.0, *) {
return UIGraphicsImageRenderer(size: bounds.size).image { _ in
drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
}
} else {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)
drawHierarchy(in: self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
UIGraphicsEndImageContext()
return image
}
}
}
Ответ 6
func screenShotMethod()->UIImage
{
let layer = self.view.layer
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);
layer.render(in: UIGraphicsGetCurrentContext()!)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return screenshot!
}