UIView görüntüye nasıl dönüştürülür


102

Bir UIView'i bir resme dönüştürmek ve uygulamama kaydetmek istiyorum. Birisi bana bir görüntünün ekran görüntüsünü nasıl alacağımı veya bir görüntüye nasıl dönüştürebileceğimi ve onu bir uygulamaya kaydetmenin en iyi yolunun ne olduğunu söyleyebilir mi (Film rulosu değil)? İşte görünümün kodu:

var overView   = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)

Yanıtlar:


206

Bir uzantı UIViewhile yapmalı.

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

Apple UIGraphicsBeginImageContext, P3 renk gamının tanıtımıyla iOS 10'u başlatmayı önermiyor. UIGraphicsBeginImageContextyalnızca sRGB ve 32 bittir. UIGraphicsImageRendererTamamen renk yönetimli, blok tabanlı, PDF'ler ve görüntüler için alt sınıflara sahip ve bağlam ömrünü otomatik olarak yöneten yeni API'yi tanıttılar . Check out WWDC16 oturumu 205 daha fazla ayrıntı için (görüntü işleme 11:50 işareti etrafında başlar)

Her cihazda çalıştığından emin olmak için #available, iOS'un önceki sürümlerine geri dönüş ile birlikte kullanın :

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContext(self.frame.size)
            self.layer.render(in:UIGraphicsGetCurrentContext()!)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return UIImage(cgImage: image!.cgImage!)
        }
    }
}

9
Bu doğru cevap olarak işaretlenmelidir. Diğer tüm seçenekler, oluşturulan görüntünün netliğini kaybetmesine ve pikselli / bulanık görünmesine neden olur.
TuplingD

Tek doğru yol! Yeni başlayanlar için kullanım şu şekildedir: let image = customView.asImage ()
Fabio

1
UIView'i şeffaf bir arka planla oluşturmak mümkün mü? Benimkinin bazı yuvarlak köşeleri var.
ixany

2
Teşekkür ederim! Biri biliyorsa, hackingwithswift.com/example-code/media/… ' den gelen kodda ne gibi farklılıklar olduğunu bilmek isterim : renderer.image {ctx in drawHierarchy (in: bounds, afterScreenUpdates: true)}
Kqtr

1
Görünüm SCNScene alt görünümleri içeriyorsa bu işe yaramaz
johnnyMac

64

uzantıyı kullanabilirsin

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}

İşte hızlı 3/4 versiyonu:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}

5
Bunu soran ben olmaktan utanıyorum ama buna nasıl isim vereceğim? Resim olmak istediğim hiçbir resmim ve UIView'ım yok. Yukarıdaki kod bana bir UIImage uzantısı veriyor ... ama şimdi ne olacak?
Dave G

8
let image = UIImage(view: myView)
doctorBroctor

UIGraphicsGetCurrentContext () nil olabileceği ve kod çöktüğü için benim için çalışmıyor.
Juan Carlos Ospina Gonzalez

@JuanCarlosOspinaGonzalez UIGraphicsGetCurrentContext nil döndürdüyse, neden başarısız olduğunu anlamak için UIGraphicsBeginImageContext'i kontrol etmeniz gerektiğinden şüpheleniyorum. Tahminim, bedeninizin boyutlarından birinin sıfır veya başka şekilde geçersiz olduğu, ancak bunun başarısız olmasına neyin sebep olabileceği hakkında hiçbir fikrim yok.
John Stephen

2
Ayrıca ekranın ölçeğini de aklınızda bulundurmalısınız, böylece başlatıcının ilk satırını şununla değiştiririm: UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
iVentis

41

Tarafından görüntüye UIView dönüştürün drawViewHierarchyInRect: afterScreenUpdates: hangi birçok kat daha hızlı renderInContext daha

Önemli not: bu işlevi viewDidLoad veya viewWillAppear'dan çağırmayın , tam olarak görüntülendikten / yüklendikten sonra bir görünümü yakaladığınızdan emin olun

Obj C

     UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.opaque, 0.0f);
     [myView drawViewHierarchyInRect:myView.bounds afterScreenUpdates:NO];
     UIImage *snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

     myImageView.image =  snapshotImageFromMyView;

Düzenlenen görüntü Fotoğraf albümünü kaydedin

     UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);

Swift 3/4

    UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.isOpaque, 0.0)
    myView.drawHierarchy(in: myView.bounds, afterScreenUpdates: false)
    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    print(snapshotImageFromMyView)
    myImageView.image = snapshotImageFromMyView

Uzantı, iOS11, swift3 / 4 ile süper kolay genelleme

extension UIImage{
    convenience init(view: UIView) {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    self.init(cgImage: (image?.cgImage)!)

  }
}


Use : 
 //myView is completly loaded/visible , calling this code after only after viewDidAppear is call
 imgVV.image = UIImage.init(view: myView)
 // Simple image object
 let img =  UIImage.init(view: myView)

3
Benim için çalışmak yok UiImage'ım için bir blackScreen aldım
Badr Filali

Gerçekten mi ?? Kodunuzu buraya yapıştırabilir misiniz .. U, UIImage olarak dönüştürmek için yanlış UIView nesnesi kullanıyor olabilir.
ViJay Avhad

`func convertViewIntoImg () -> Void {imgFakeCard.image = UIImage.init (view: card)}` Swift 3'teki uzantınız ile bu işlev viewDidLoad'da çağrılır
Badr Filali

1
Kodunuzu gönderdiğiniz ve viewDidLoad'da aradığınızı belirttiğiniz için teşekkür ederiz. İşte yanlış yaptığın şey. Belleğe yüklenmeden önce bir anlık görüntü görüntüsü çekiyorsunuz. Lütfen sorunu kesin olarak çözecek olan viewDidAppear'daki kodu çağırmayı deneyin. Herhangi bir sorunuz lütfen cevaplayınız.
ViJay Avhad

Bu çalışma iyiler sayesinde sorun senin uzantısı olarak adlandırılan yerden geldi
Badr Filali

20

İOS 10'da:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}

1
bu çökmelere yol açar.
KingPolygon

18

İOS 10 ve Swift 3'ten itibaren en iyi uygulama

iOS 9 ve önceki sürümleri desteklemeye devam ederken , iOS 13, Xcode 11.1, Swift 5.1'den itibaren çalışmaya devam eder

extension UIView {

    func asImage() -> UIImage? {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
            defer { UIGraphicsEndImageContext() }
            guard let currentContext = UIGraphicsGetCurrentContext() else {
                return nil
            }
            self.layer.render(in: currentContext)
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
}

Sorunun ne anlama geldiğinden emin değilim:

bir uygulamaya kaydetmenin en iyi yolu nedir (Film rulosu değil)?


17
    UIGraphicsBeginImageContext(self.view.bounds.size);        
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
    var screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


1
UIGraphicsGetImageFromCurrentImageContext, UIImage döndürür.
UIImage'a aktarmaya

Bu, tüm görünümün ekran görüntüsünü alıyor değil mi? Ben sadece self.view'un alt görünümü olan kodumdaki bir UIView yani genel bakışı bir resme dönüştürmek istiyorum. Görüntünün tamamı değil!
Sameer Hussain

İ image.it çok small.what görüntülemek yazdırmaya çalıştı @Vakas bunun için çözüm
Krutarth Patel

6
Ekran görüntüsü görüntüsünün kalitesi iyi değil, ne yapmalıyım?
Neela

13

Örneğin, bir boyut görünümüm varsa: 100,100'de 50 50. Ekran görüntüsü almak için aşağıdakileri kullanabilirim:

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0);
    self.view.drawViewHierarchyInRect(CGRectMake(-50,-5-,view.bounds.size.width,view.bounds.size.height), afterScreenUpdates: true)
    var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();

self.view satırında parametrede hata var. bence -5 değil -5-
Krutarth Patel

@sameer bir sorum var. bu resmi yazdırdığımda çok küçük
Krutarth Patel

7

Bence, başlatıcıyla olan yaklaşım o kadar da iyi değil çünkü iki görüntü oluşturuyor.

Bunu tercih ederim:

extension UIView {
    var snapshot: UIImage? {
        UIGraphicsBeginImageContext(self.frame.size)
        guard let context = UIGraphicsGetCurrentContext() else {
            return nil
        }
        layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

Mülke görüntüden başka bir şey demelisiniz. Bu, UIImageView gibi görüntü adı verilen özelliklere sahip alt sınıflara müdahale edebilir.
Hobbes the Tige

@HobbestheTige'in önerisini takip etti ve mülkü yeniden adlandırdı
Tino

6

Swift 4.2, iOS 10

extension UIView {

    // If Swift version is lower than 4.2, 
    // You should change the name. (ex. var renderedImage: UIImage?)

    var image: UIImage? {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in layer.render(in: rendererContext.cgContext) }
    }
}

Örneklem

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = .blue

let view2 = UIView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))
view2.backgroundColor = .red
view.addSubview(view2)

let imageView = UIImageView(image: view.image)

görüntü açıklamasını buraya girin


Projenizde herhangi bir UIImageViews kullanıyorsanız bunun başka bir adla adlandırılması gerektiğini belirtmek istedim, aksi takdirde .image salt okunur olur. Belki buna 'image' yerine 'screenCapture' diyebilirsiniz.
Chris

@Chris Evet, haklısın. Swift sürümü 4.2'den düşükse bir adı değiştirmelisiniz. Hatayı işaret ettiğiniz için teşekkür ederiz.
Den

6

Bu benim için Xcode 9 / Swift 3.2 / Swift 4 ve Xcode 8 / Swift 3 için çalışıyor

 if #available(iOS 10.0, *) {

     // for Xcode 9/Swift 3.2/Swift 4 -Paul Hudson's code
     let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
     let capturedImage = renderer.image { 
         (ctx) in
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
     }
     return capturedImage

 } else {

     // for Xcode 8/Swift 3
     UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
     view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
     let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     return capturedImage!
 }

Bunu bir işlev içinde nasıl kullanacağınız aşağıda açıklanmıştır:

fileprivate func captureUIImageFromUIView(_ view:UIView?) -> UIImage {

     guard (view != nil) else{

        // if the view is nil (it's happened to me) return an alternative image
        let errorImage = UIImage(named: "Error Image")
        return errorImage
     }

     // if the view is all good then convert the image inside the view to a uiimage
     if #available(iOS 10.0, *) {

         let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
         let capturedImage = renderer.image { 
             (ctx) in
             view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
         }
         return capturedImage

     } else {

         UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
         let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
         UIGraphicsEndImageContext()
         return capturedImage!
     }
}

İşlevden döndürülen görüntüyle bir şeyler nasıl yapılır:

@IBOutlet weak fileprivate var myCustomView: UIView!
var myPic: UIImage?

let myImageView = UIImageView()

@IBAction fileprivate func saveImageButtonTapped(_ sender: UIButton) {

   myPic = captureUIImageFromUIView(myCustomView)

   // display the pic inside a UIImageView
   myImageView.image = myPic!
}

Ben var Xcode 9 / Swift 3.2 / Swift 4 Paul Hudson cevabını UIImage dönüştürmek UIView

Ben var Xcode 8 / Swift 3 bir longgg zaman önce benzeri bir yere gelen ve nerede unuttum :(


Ayrıca görüntü nerede görüntülenir ve / veya kaydedilir?
Famic Tech

@FamicTech, görüntü oluşturulduktan sonra onunla ne yapacağına karar vermek gençlere kalmıştır. Kodumdaki örnekte, UIView'ı "myPic" adlı bir UIImage'a dönüştürdüm ancak "myPic" ile hiçbir şey yapmadım. Bir sonraki olası adım, bir UIImageVIew içinde şu şekilde 'myPic'i görüntülemektir: myImageVIew.image = myPic. Bir collectionView kullanıyorsanız ve içindeki görüntüleri görüntülemek istiyorsanız, o zaman her hücrede bir UIImageVIew oluşturursunuz ve ardından UIImageVIew içindeki görüntüyü (myPic) veri kaynağından indexPath.item aracılığıyla görüntülersiniz ex: myImageView.image = dataSource [indexPath .item] .myPic
Lance Samaria

@FamicTech Küçük bir hata yapıyorsunuz. Bunun koleksiyonla ilgisi yok VIew. 2 farklı sınıf türünüz var: UIImage ve bir UIView. Her ikisi de herhangi bir resmi görüntülemek için kullanılabilir, ancak her ikisi de bunu farklı şekillerde yapar. İOS'taki hemen hemen her şey bir UIView alt sınıfıdır, ancak bir UIImage yalnızca görüntüleri gösterebilir (2 farklı şey). Bu işlevin yaptığı şey, UIVIew'i almak ve onu bir UIImage'a dönüştürmektir. Daha kolay bir örn. 4.0'ı (Double) 4'e (Int) dönüştürmek istiyorsanız, bunu Int (4.0) sonucunu 4'e çevirirsiniz. Ancak bununla UIVIew içindeki görüntüyü bir UIImage'a dönüştürürsünüz. Anlama?
Lance Samaria

Yapmaya çalıştığım şey, kullanıcının Koleksiyon Görüntüleme Denetleyicime gelmesini ve mevcut görünümü alması gereken bir düğmeye basması, bu da bir Koleksiyon Görünümü 10x10 olur ve tüm 10x10 ızgarasının bir görüntüsünü oluşturur (lütfen tümünün ızgara görünümde tam olarak görünmez). Yukarıdaki kodunuz bu kullanım durumunu çözüyor mu?
Famic Tech

Düğme, Gezinme Denetleyicisindedir. Kullanıcı buna tıklar ve gezinme denetleyicisi altında görüntülenen Koleksiyon Görünümünü 'almalı' ve Koleksiyon Görünümündeki Hücrelerdeki tüm bilgilerle bir Koleksiyon Görünümü Resmi (bir PDF de işe yarar) oluşturmalıdır.
Famic Tech

5
var snapshot = overView.snapshotViewAfterScreenUpdates(false)

veya hedef-c

UIView* snapshot = [overView snapshotViewAfterScreenUpdates:NO];

İmageView, görüntü ile aynı mı? Öyleyse bunu uygulamama nasıl kaydederim?
Sameer Hussain

4

Bunun gibi uzantıyı kullanarak kolayca kullanabilirsiniz

// Take a snapshot from a view (just one view)
let viewSnapshot = myView.snapshot

// Take a screenshot (with every views in screen)
let screenSnapshot = UIApplication.shared.snapshot

// Take a snapshot from UIImage initialization
UIImage(view: self.view)

Bu uzantı yöntemini / değişkenlerini kullanmak istiyorsanız, bunu uygulayın

  1. UIImage uzantısı

    extension UIImage {
        convenience init(view: UIView) {
            if let cgImage = view.snapshot?.cgImage {
                self.init(cgImage: cgImage)
            } else {
                self.init()
            }
        }
    }
    
  2. UIView uzantısı

    extension UIView {
    
        var snapshot: UIImage? {
            UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
            if UIGraphicsGetCurrentContext() != nil {
                drawHierarchy(in: bounds, afterScreenUpdates: true)
                let screenshot = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                return screenshot
            }
            return nil
        }
    }
    
  3. UIApplication uzantısı

    extension UIApplication {
    
        var snapshot: UIImage? {
            return keyWindow?.rootViewController?.view.snapshot
        }
    }
    

Alt görünümlerle zPositions manipüle edilmiş bir görünüm elde ettim ve diğer yanıtlar bana doğru katman konumlarını vermedi, teşekkür ederim.
Ashkan Ghodrat

3

veya iOS 10+ yeni UIGraphicsImageRenderer'ı + bazı durumlarda layer.renderInContext'ten çok daha hızlı olabilecek önerilen drawHierarchy'yi kullanabilirsiniz.

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
        return renderer.image { _ in
            self.drawHierarchy(in: CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height), afterScreenUpdates: false)
        }
    }
}

3

Teşekkürler @Bao Tuan Diep! Ek eklemek istiyorum.

Kodu kullandığınızda:

yourView.layer.render(in:UIGraphicsGetCurrentContext()!)

Şunları fark etmelisiniz:

 - If you had used `autoLayout` or `Masonry` in `yourView` (that you want to convert) .
 - If you did not add `yourView` to another view which means that `yourView` was not used as a subview but just an object.

O zaman kullanmanız gerekenler :

[yourView setNeedsLayout];
[yourView layoutIfNeeded];

daha yourViewönce güncellemekyourView.layer.render(in:UIGraphicsGetCurrentContext()!) .

Aksi takdirde hiçbir öğe içermeyen bir görüntü nesnesi alabilirsiniz.


Bunun için teşekkürler. Çok yardımcı oldu !!
Maksim Kniazev

2

Swift 4.2

import Foundation
import UIKit  

extension UIImage {

    convenience init(view: UIView) {

        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)

    } 
}

kullanma:

let img = UIImage.init (görünüm: self.holderView)


1

Swift 3'te Uygulama :

Sınıf kapsamı dışında aşağıdaki kodu ekleyin.

extension UIImage {
    convenience init(_ view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}

Kullanım:

let image = UIImage( Your_View_Outlet )

"En az bir kez işlenmemiş bir görünüm (0x1040a6970, UIView) çizmek için gerekli" hatası alma hatası
kishu mewara

0

Uyguladık @Naveed J. yöntemini bu şekilde ve harika çalıştı.

İşte uzantısı:

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

İşte bunu nasıl uyguladım.

//create an image from yourView to display
//determine the frame of the view/imageimage
let screen = self.superview!.bounds
let width = screen.width / 4 //make image 1/4 width of screen
let height = width
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let x = (screen.size.width - frame.size.width) * 0.5
let y = (screen.size.height - frame.size.height) * 0.5
let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height)

let yourView = YourView() //instantiate yourView
yourView.frame = mainFrame //give it the frame
yourView.setNeedsDisplay() //tell it to display (I am not 100% sure this is needed)

let characterViewImage = yourView.asImage()

0

İOS 10'dan beri mevcut olan yeni UIGraphicsImageRenderer ile başlatıcı:

extension UIImage{
    convenience init(view: UIView) {

    let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
    let canvas = CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height)
    let image = renderer.image { _ in
        self.drawHierarchy(in: canvas, afterScreenUpdates: false)
    }
    self.init(cgImage: (image?.cgImage)!)
  }
}

0

benimle iyi çalış!

Swift4

 extension UIView {

    func toImage() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
        self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
        let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImageFromMyView!
    }

    }

return snapshotImageFromMyView!Konu 1: Önemli hata: İsteğe bağlı bir değeri açarken beklenmedik şekilde sıfır bulundu
Takasur

0

Görünüm bulanık alt görünüm içerir (örn. UIVisualEffectView örneği), yalnızca drawViewHierarchyInRect: afterScreenUpdates çalışır.

@ViJay Avhad'ın cevabı bu dava için doğrudur.


0

UIGraphicsImageRenderer'ın kullanılması, görünüm Scene Kit alt görünümleri, Metal veya Sprite Kit alt görünümleri içerdiğinde çalışmaz. Bu durumlarda kullanın

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}

-1
please try below code.
-(UIImage *)getMainImageFromContext
{
UIGraphicsBeginImageContextWithOptions(viewBG.bounds.size, viewBG.opaque, 0.0);
[viewBG.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.