尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS

Posted

技术标签:

【中文标题】尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS【英文标题】:Trying to make a screenshot button that sends the screenshot to my camera roll, when the button is clicked. Swift 3, Xcode 8, IOS 【发布时间】:2017-02-15 17:14:21 【问题描述】:

Swift 3、Xcode 8、ios

我似乎无法弄清楚自己做错了什么,没有显示任何错误,但是当我单击应用程序中的按钮时,没有任何反应,并且没有任何内容保存在我的模拟器相机胶卷中。

这是我为视图控制器中的按钮所做的:

import UIKit
class ViewController: ViewController 

override func viewDidLoad()  
    super.viewDidLoad() 


override func didReceiveMemoryWarning()  
    super.didReceiveMemoryWarning() 


@IBAction func buttonAction(_ sender: UIButton) 
    func captureScreen() 

        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
    


【问题讨论】:

【参考方案1】:

问题是你把截图代码放在你的buttonAction方法名称captureScreen的嵌套函数中,并且从未调用过该方法,不需要添加嵌套方法。因此,只需删除该函数并将屏幕截图代码直接放在按钮操作方法中即可。所以用这个替换你的按钮操作。

@IBAction func buttonAction(_ sender: UIButton) 

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)        

【讨论】:

"这个应用程序已经崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用程序的 Info.plist 必须包含一个 NSPhotoLibraryUsageDescription 键和一个字符串值,向用户解释应用程序如何使用它数据。(lldb)“ @DanielG 检查这个答案 ***.com/a/40012626/6433023 并在 info.plist 中添加隐私照片库 好的,谢谢! :) @DanielG 欢迎朋友 :) @NiravD +1 非常感谢,它有帮助【参考方案2】:

在 Swift 3.1 中

首先你需要编辑你的 info.plist 文件

import Photos        

然后添加uibutton:

@IBOutlet weak var shutterButton: UIButton!



@IBAction func shotAction(_ sender: Any) 
    guard shutterButton.isEnabled else 
        return
    

    let takeScreenshotBlock = 
        //Render and capture an UIView named view:
        self.shutterButton.isHidden = true
        UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0.0)
        self.view.drawHierarchy(in: self.view.frame, afterScreenUpdates: true)
        if let image = UIGraphicsGetImageFromCurrentImageContext() 
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        
        UIGraphicsEndImageContext();
        self.shutterButton.isHidden = false


        DispatchQueue.main.async 
            // briefly flash the screen
            let flashOverlay = UIView(frame: self.sceneView.frame)
            flashOverlay.backgroundColor = UIColor.white
            self.sceneView.addSubview(flashOverlay)
            UIView.animate(withDuration: 0.25, animations: 
                flashOverlay.alpha = 0.0
            , completion:  _ in
                flashOverlay.removeFromSuperview()
            )
        
    
    switch phphotoLibrary.authorizationStatus() 
    case .authorized:
        takeScreenshotBlock()
    case .restricted, .denied:
        let alertController = UIAlertController(title: "Photo access denied", message: "Please enable Photos Library access for this appliction in Settings > Privacy.", preferredStyle: UIAlertControllerStyle.alert)
        let actionOK = UIAlertAction(title: "OK", style: .cancel, handler: nil)
        alertController.addAction(actionOK)
        present(alertController, animated: true, completion: nil)
    case .notDetermined:
        PHPhotoLibrary.requestAuthorization( (status) in
            if status == .authorized 
                takeScreenshotBlock()
            
        )
    

【讨论】:

以上是关于尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS的主要内容,如果未能解决你的问题,请参考以下文章

如何制作小部件的屏幕截图并将其粘贴到 QGraphicsView 中?

Unity 录制视频并截图

如何创建透明 Unity 窗口 + OS 的屏幕截图

如何使用自动布局将按钮放在屏幕底部

如何仅捕获屏幕上的鼠标单击区域?

在视图变得不可见后执行任务