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 4 및 Xcode 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.