UIView를 이미지로 변환하는 방법


94

UIView를 이미지로 변환하고 내 앱에 저장하고 싶습니다. 누군가 뷰의 스크린 샷을 찍거나 이미지로 변환하는 방법과이를 앱 (카메라 롤이 아님)에 저장하는 가장 좋은 방법은 무엇입니까? 보기에 대한 코드는 다음과 같습니다.

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)

답변:


189

확장 기능 UIView이 트릭을 수행해야합니다.

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 색 영역을 도입하여 iOS 10을 시작하는 것을 권장하지 않습니다 . UIGraphicsBeginImageContextsRGB 및 32 비트 전용입니다. 그들은 UIGraphicsImageRenderer완전히 색상이 관리되고 블록 기반이며 PDF 및 이미지에 대한 하위 클래스가 있으며 컨텍스트 수명을 자동으로 관리 하는 새로운 API를 도입했습니다 . 확인 WWDC16 세션 (205) 자세한 내용은 (이미지 렌더링은 11시 50분 마크 주위에 시작)

모든 기기에서 작동하는지 확인하려면 #available이전 버전의 iOS 로의 폴 백과 함께 사용 하세요.

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
이것은 정답으로 표시되어야합니다. 다른 모든 옵션을 사용하면 렌더링 된 이미지의 선명도가 떨어지고 픽셀 화 / 흐릿하게 보입니다.
TuplingD

유일한 올바른 방법! 초보자를위한 사용법은 다음과 같습니다하자 이미지 = customView.asImage ()
파비오

1
투명한 배경으로 UIView를 렌더링 할 수 있습니까? 내 모서리에는 둥근 모서리가 있습니다.
ixany

@ixany 이것은 이미 처리해야합니다. 난 그냥 놀이터에서 다음과 같이 그것을 시도하고 일 : let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
Naveed J.

2
감사합니다! 아는 사람이 있다면 hackingwithswift.com/example-code/media/… 의 코드와 어떤 차이가 있는지 궁금합니다 . : return renderer.image {ctx in drawHierarchy (in : bounds, afterScreenUpdates : true)}
Kqtr

63

당신은 확장을 사용할 수 있습니다

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

여기에 신속한 3/4 버전이 있습니다.

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
이 질문을하는 게 부끄럽지만 어떻게 부르지? 나는 이미지가되고 싶은 이미지와 UIView가 없습니다. 위의 코드는 나에게 UIImage 확장을 제공합니다.
Dave G

8
let image = UIImage(view: myView)
doctorBroctor

UIGraphicsGetCurrentContext ()가 nil 일 수 있고 코드가 충돌하므로 나를 위해 작동하지 않습니다.
Juan Carlos Ospina Gonzalez

@JuanCarlosOspinaGonzalez UIGraphicsGetCurrentContext가 nil을 반환하면 UIGraphicsBeginImageContext를 확인하여 실패한 이유를 파악해야한다고 생각합니다. 내 생각 엔 크기의 크기 중 하나가 0이거나 그렇지 않으면 유효하지 않은 것 같습니다.하지만 이것이 실패의 원인이 무엇인지 실제로는 모릅니다.
John Stephen

2
또한 화면의 크기를 염두에 두어야하므로 이니셜 라이저의 첫 번째 줄을 다음과 같이 UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
바꿉니다

41

에 의해 영상에 UIView의 변환 drawViewHierarchyInRect : afterScreenUpdates을 :여러 번 빠르게 renderInContext 이상

중요 참고 사항 : viewDidLoad 또는 viewWillAppear 에서이 함수를 호출하지 마십시오 . 뷰가 완전히 표시 /로드 된 후 뷰를 캡처하고 있는지 확인하십시오.

Obj C

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

     myImageView.image =  snapshotImageFromMyView;

편집 된 이미지 사진 앨범 저장

     UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);

스위프트 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

확장자, iOS11, swift3 / 4로 매우 쉽게 일반화

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
나를 위해 작업은 내가있는 UIImage에 대한 blackScreen 없어
바드르 Filali에게

정말 ?? 여기에 코드를 붙여 넣을 수 있습니다. U는 잘못된 UIView 개체를 사용하여 UIImage로 변환 할 수 있습니다.
ViJay Avhad 2017-06-29

`convertViewIntoImg () FUNC -> 무효 : {imgFakeCard.image = UIImage.init (보기 카드)}`빠른 3의 확장으로이 기능이있는 viewDidLoad에서 호출
바드르 Filali

1
코드를 게시하고 viewDidLoad에서 호출했다고 언급 해 주셔서 감사합니다. 여기에 당신이 잘못한 것이 있습니다. 메모리에로드되기 전에 뷰의 스냅 샷을 캡처하고 있습니다. viewDidAppear에서 코드를 호출하면 문제가 확실히 해결됩니다. 질문이 있으시면 답장 해주십시오.
비제이 Avhad

그 작업 유명한 선수의 덕분에, 문제는 확장라는 곳에서 온
바드르 Filali

20

iOS 10 :

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
이것은 충돌로 이어집니다.
KingPolygon 2017 년

18

iOS 10 및 Swift 3 기준 모범 사례

iOS 9 및 이전 버전을 계속 지원하면서 iOS 13, Xcode 11.1, Swift 5.1에서 계속 작동합니다.

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()
        }
    }
}

질문이 무엇을 의미하는지 잘 모르겠습니다.

카메라 롤이 아닌 앱에 저장하는 가장 좋은 방법은 무엇입니까?


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


1
UIGraphicsGetImageFromCurrentImageContext는 UIImage를 반환합니다. UIImage에 캐스팅 할 필요가 없습니다.
Leo Dabus 2015-06-07

이것은 전체 뷰의 스크린 샷을 찍습니다. 나는 단지 UIView, 즉 self.view의 subview 인 내 코드의 개요를 이미지로 변환하고 싶습니다. 전체보기가 아닙니다!
Sameer Hussain

난 image.it 너무 작을 텐데요 표시 인쇄하려고 @Vakas 이에 대한 해결책
Krutarth 파텔

6
스크린 샷 이미지의 품질이 좋지 않습니다. 어떻게해야합니까?
닐라

13

예를 들어 크기보기가있는 경우 : 50 50 at 100,100. 다음을 사용하여 스크린 샷을 찍을 수 있습니다.

    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 라인에 -5- parameter.i에서 실수가 -5 안 생각이
Krutarth 파텔

@sameer 내가 너무 작은 이미지를 인쇄 question.when 하나가
Krutarth 파텔

7

제 생각에는 이니셜 라이저를 사용한 접근 방식은 두 개의 이미지를 생성하기 때문에 그다지 좋지 않습니다.

나는 이것을 선호한다 :

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
    }
}

이미지가 아닌 다른 속성을 호출해야합니다. 이는 UIImageView와 같이 image라는 속성이있는 하위 클래스를 방해 할 수 있습니다.
홉스 Tige

@HobbestheTige의 제안을 다음과 재산 이름
티노

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) }
    }
}

견본

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)

여기에 이미지 설명 입력


프로젝트에서 UIImageView를 사용하는 경우 다른 이름을 지정해야한다는 점을 지적하고 싶었습니다. 그렇지 않으면 .image가 읽기 전용이됩니다. '이미지'대신 'screenCapture'라고 부를 수 있습니다.
Chris

@Chris 네, 맞아요. Swift 버전이 4.2 미만이면 이름을 변경해야합니다. 실수를 지적 해주셔서 감사합니다.
Den

6

이것은 Xcode 9 / Swift 3.2 / Swift 4Xcode 8 / Swift 3 에서 저에게 적합합니다.

 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!
 }

함수 내에서 사용하는 방법은 다음과 같습니다.

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!
     }
}

함수에서 반환 된 이미지로 작업을 수행하는 방법은 다음과 같습니다.

@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!
}

내가 가지고 엑스 코드 (9) / 스위프트 3.2 / 스위프트 4 폴 허드슨에서 대답 있는 UIImage로 변환하여 UIView를

나는 오래 전에 어딘가에서 Xcode 8 / Swift 3 를 얻었고 어디에서 잊었는지 잊어 버렸습니다 :(


또한 이미지는 어디에 표시 및 / 또는 저장됩니까?
Famic Tech

@FamicTech 이미지가 생성되면 청소년이 무엇을 할 것인지 결정합니다. 내 코드의 예제에서 방금 UIView를 "myPic"이라는 UIImage로 변환했지만 'myPic'으로 아무것도하지 않았습니다. 다음으로 가능한 단계는 다음과 같이 UIImageVIew 안에 'myPic'을 표시하는 것입니다. myImageVIew.image = myPic. collectionView를 사용하고 있고 그 안에 이미지를 표시하고 싶다면 각 셀에 UIImageVIew를 만든 다음 데이터 소스의 indexPath.item을 통해 UIImageVIew 내부에 이미지 (myPic)를 표시합니다. 예 : myImageView.image = dataSource [indexPath .item] .myPic
랜스 사마리아

@FamicTech 당신은 약간의 실수를하고 있습니다. 이것은 collectionVIew와 관련이 없습니다. UIImage와 UIView의 두 가지 클래스 유형이 있습니다. 둘 다 이미지를 표시하는 데 사용할 수 있지만 둘 다 다른 방식으로 수행합니다. iOS의 거의 모든 것이 UIView의 하위 클래스이지만 UIImage는 이미지 만 표시 할 수 있습니다 (2 가지). 이 함수가하는 일은 UIVIew를 가져 와서 UIImage로 변환하는 것입니다. 더 쉬운 예. 4.0 (Double)을 4 (Int)로 변환하려면 Int (4.0) 결과가 4입니다.하지만이를 사용하여 UIVIew 내부의 이미지를 UIImage로 변환합니다. 이해하다?
Lance Samaria

내가하려는 것은 사용자가 내 컬렉션 뷰 컨트롤러로 와서 컬렉션 뷰 10x10이되는 현재 뷰를 가져 가야하는 버튼을 누르고 전체 10x10 그리드의 이미지를 생성하도록하는 것입니다 (전체 그리드가보기에서 완전히 보이지 않음). 위의 코드가 해당 사용 사례를 해결합니까?
Famic Tech

버튼은 내비게이션 컨트롤러에 있습니다. 사용자는 그것을 클릭하고 내비게이션 컨트롤러 아래에 표시된 컬렉션 뷰를 가져와 컬렉션 뷰의 셀에있는 모든 정보와 함께 컬렉션 뷰 이미지 (PDF도 작동 함)를 생성해야합니다.
Famic Tech

5
var snapshot = overView.snapshotViewAfterScreenUpdates(false)

또는 목적 -c

UIView* snapshot = [overView snapshotViewAfterScreenUpdates:NO];

imageView는 이미지와 동일합니까? 그렇다면 내 앱에 어떻게 저장합니까?
Sameer Hussain

4

다음과 같은 확장 기능을 사용하여 쉽게 사용할 수 있습니다.

// 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)

해당 확장 메서드 / 변수를 사용하려면 다음을 구현하십시오.

  1. UIImage 확장

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

    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 확장

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

나는 subviews zPositions가 조작 된 뷰가 있었고 다른 답변은 올바른 레이어 위치를 제공하지 않았습니다. 감사합니다.
Ashkan Ghodrat

3

또는 iOS 10 이상에서는 새로운 UIGraphicsImageRenderer + 권장되는 drawHierarchy를 사용할 수 있으며, 일부 상황에서는 layer.renderInContext보다 훨씬 빠를 수 있습니다.

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

감사합니다 @Bao Tuan Diep! 보충제를 추가하고 싶습니다.

코드를 사용하는 경우 :

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

다음 사항에 유의해야합니다.

 - 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.

그런 다음 사용해야합니다 .

[yourView setNeedsLayout];
[yourView layoutIfNeeded];

업데이트 yourView이전yourView.layer.render(in:UIGraphicsGetCurrentContext()!) 합니다.

그렇지 않으면 요소가없는 이미지 객체를 얻을 수 있습니다.


감사합니다. 많이 도왔습니다 !!
Maksim Kniazev

2

스위프트 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)!)

    } 
}

사용 :

let img = UIImage.init (view : self.holderView)


1

Swift 3 에서 구현 :

클래스 범위를 벗어난 아래 코드를 추가합니다.

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

사용법 :

let image = UIImage( Your_View_Outlet )

오류가 "한 번에 적어도 렌더링되지 않은보기 (0x1040a6970, UIView의)를 그리기 필요"
기슈 mewara

0

@Naveed J를 구현 했습니다. 이와 같이 의 방법을 했으며 매력처럼 작동했습니다.

그의 확장은 다음과 같습니다.

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)
        }
    }
}

구현 방법은 다음과 같습니다.

//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

iOS 10부터 사용할 수있는 새로운 UIGraphicsImageRenderer가있는 이니셜 라이저 :

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

나랑 잘 일해!

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!1 스레드 : 치명적인 오류 : 예기치 않게 발견 전무을하는 옵션 값 풀기 동안
Takasur

0

뷰에 흐릿한 하위 뷰 (예 : UIVisualEffectView 인스턴스)가 포함 된 경우 drawViewHierarchyInRect : afterScreenUpdates 작동합니다.

@ViJay Avhad의 대답 은이 경우에 맞습니다.


0

뷰에 Scene Kit 하위 뷰, Metal 또는 Sprite Kit 하위 뷰가 포함 된 경우 UIGraphicsImageRenderer 사용이 작동하지 않습니다. 이 경우

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.