How Do I Take a Screen Shot of a UIView?

后端 未结 15 2775
-上瘾入骨i
-上瘾入骨i 2020-11-22 09:28

I am wondering how my iPhone app can take a screen shot of a specific UIView as a UIImage.

I tried this code but all I get is a blank image

15条回答
  •  忘了有多久
    2020-11-22 09:46

    Details

    • Xcode Version 10.3 (10G8), Swift 5

    Solution

    import UIKit
    
    extension CALayer {
        func makeSnapshot() -> UIImage? {
            let scale = UIScreen.main.scale
            UIGraphicsBeginImageContextWithOptions(frame.size, false, scale)
            defer { UIGraphicsEndImageContext() }
            guard let context = UIGraphicsGetCurrentContext() else { return nil }
            render(in: context)
            let screenshot = UIGraphicsGetImageFromCurrentImageContext()
            return screenshot
        }
    }
    
    extension UIView {
        func makeSnapshot() -> UIImage? {
            if #available(iOS 10.0, *) {
                let renderer = UIGraphicsImageRenderer(size: frame.size)
                return renderer.image { _ in drawHierarchy(in: bounds, afterScreenUpdates: true) }
            } else {
                return layer.makeSnapshot()
            }
        }
    }
    

    Usage

    let image = view.makeSnapshot()
    

    Full sample

    Do not forget to add the solution code here

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet var viewForScreenShot: UIView!
        @IBOutlet var screenShotRenderer: UIImageView!
    
        @IBAction func makeViewScreenShotButtonTapped2(_ sender: UIButton) {
            screenShotRenderer.image = viewForScreenShot.makeSnapshot()
        }
    }
    

    Main.storyboard

    
    
        
            
        
        
            
            
            
        
        
            
            
                
                    
                        
                            
                            
                        
                        
                            
                            
                            
                                
                                    
                                    
                                        
                                            
                                            
                                                
                                                
                                            
                                            
                                            
                                            
                                        
                                    
                                    
                                    
                                    
                                        
                                        
                                    
                                
                                
                                
                                    
                                    
                                        
                                        
                                    
                                
                            
                            
                            
                                
                                
                                
                                
                                
                                
                                
                                
                            
                        
                        
                            
                            
                        
                    
                    
                
                
            
        
    
    

    Result

提交回复
热议问题