iOS UIPasteboard

时间:2020-02-23 14:45:56  来源:igfitidea点击:

在本教程中,我们将在iOS应用程序中讨论和实现UIPasteboard类。

UIPasteboard

UIPasteboard类提供一个剪贴板,用于在应用程序内以及一个应用程序与另一个应用程序之间共享数据。

使用UIPasteboard,您可以复制粘贴的文本,URL,图像和其他数据类型。
UIPasteboard有一个系统范围的剪贴板,用于保存您复制的数据。

以下是UIPasteboard的重要帮助程序属性和功能:

"一般"属性用于检索系统范围的UIPasteboard。

let pasteboard = UIPasteboard.general

创建自己的命名粘贴板:

let pasteboard = UIPasteboard.init(name: UIPasteboard.Name(rawValue: "pasteboard_name"), create: true)

在" init"方法内部,我们传递了两个参数:" name"和" create"。
使用上面的语句,我们可以检索相同名称的Pasteboard。

create参数需要一个Bool值。
如果将其设置为true,则将创建粘贴板(如果尚不存在)。

UIPasteboard.withUniqueName()返回唯一的UIPasteboard。
这将返回一个粘贴板,在所有具有相同APP ID的应用程序中可见。

要将String/URL/UIColor/UIImage复制到粘贴板,我们只需执行以下操作:

UIPasteboard.general.string = "String"
UIPasteboard.general.url = URL(string: "https://www.google.com")
UIPasteboard.general.color = UIColor.red
UIPasteboard.general.image = UIImage(named : "sample.png")

为了传递多个值,我们可以使用"字符串","颜色"," URL","图像"属性

我们还可以使用以下功能为"命名粘贴板"甚至常规粘贴板实例设置值:

  • func setValue(Any,forPasteboardType:String)–用于设置任何实例,例如字符串,日期,URL,模型对象。
    我们在第二个参数中传递值的类型。

  • func setData(Data,forPasteboardType:String)–用于设置通常为图像/视频或者文件类型的数据。

以下函数返回传入类型的数据:

  • `func data(forPasteboardType:String)->数据?
  • `func value(forPasteboardType:String)->可以吗?

func itemSet(withPasteboardTypes:[String])-> IndexSet?返回一个Set,其中包含在数组中传递的所有类型的值。

为了检查粘贴板是否具有某种类型的值,我们可以执行以下操作:

  • pasteboard.hasStrings
  • pasteboard.hasURLs
  • pasteboard.hasColors
  • pasteboard.hasImages

func setItems([[String:Any]],选项:[UIPasteboard.OptionsKey:Any] = [:** )用于将项目字典添加到Pasteboard。
我们也可以在项目上设置隐私选项。
options参数也是键-值对的字典。
以下是两个最常用的选项:

  • expiration-从粘贴板上清除项目的日期
  • localOnly–默认情况下,粘贴板是通用的。
    这意味着,如果在iOS设备上启用了切换功能,则可以在所有Apple设备上使用粘贴板。
    要仅将粘贴板限制在当前设备中,请将" localOnly"设置为true

在下一节中,我们将使用上面学习的方法和属性创建一个iOS应用程序:

项目情节提要

我们的ViewController UI由带有嵌套StackView的UIStackView组成,如下面的情节提要中所示:

我们将复制粘贴在资源文件夹中的字符串,URL和图像。

  • 顶部StackView –包含UITextField。
    其中复制粘贴将在String类型上完成。

  • 中间StackView –包含UILabel。
    其中复制粘贴将在URL类型上完成。

  • 底部StackView –包含UIImage。
    这里复制粘贴将在图像类型上完成。

代码

下面给出了ViewController.swift类的代码:

import UIKit
import MobileCoreServices

class ViewController: UIViewController {

  @IBOutlet weak var textFieldCopy: UITextField!
  @IBOutlet weak var textFieldPaste: UITextField!
  @IBOutlet weak var labelCopy: UILabel!
  @IBOutlet weak var labelPaste: UILabel!
  @IBOutlet weak var imageCopy: UIImageView!
  @IBOutlet weak var imagePaste: UIImageView!

  @IBAction func btnCopyStringAction(_ sender: Any) {
      
      UIPasteboard.general.string = textFieldCopy.text
      
  }
  
  
  @IBAction func btnPasteStringAction(_ sender: Any) {
      
      textFieldPaste.text = textFieldPaste.text! + UIPasteboard.general.string!
  }
  
  @IBAction func btnCopyUrlAction(_ sender: Any) {
      
      let oneHour = Date().addingTimeInterval(60 * 60)
      
      let pasteboard =  UIPasteboard.init(name: UIPasteboard.Name(rawValue: "sample_pasteboard"), create: true)
      pasteboard?.setItems([], options: [UIPasteboard.OptionsKey.localOnly : true, UIPasteboard.OptionsKey.expirationDate : oneHour])
      pasteboard?.setValue(URL(string: labelCopy!.text!) ?? "", forPasteboardType: kUTTypeURL as String)
  
  }
  
  @IBAction func btnPasteUrlAction(_ sender: Any) {
      
      let pasteboard = UIPasteboard.init(name: UIPasteboard.Name(rawValue: "sample_pasteboard"), create: true)
      labelPaste.text = pasteboard?.url?.absoluteString
  }
  
  @IBAction func btnCopyImageAction(_ sender: Any) {
      
      let image = imageCopy.image!
      if let data = image.pngData() {
          UIPasteboard.general.setData(data,forPasteboardType: kUTTypePNG as String)
      }
      
  }
  
  @IBAction func btnPasteImageAction(_ sender: Any) {
      
      
      let pasteboard = UIPasteboard.general
  
      let imageTypes = UIPasteboard.typeListImage as! [String]
      
      if pasteboard.contains(pasteboardTypes: imageTypes) {
          for imageType in imageTypes {
              if let data = pasteboard.data(forPasteboardType: imageType) {
                  if let pasteThisImage = UIImage(data: data) {
                      imagePaste.image = pasteThisImage
                      break
                  }
              }
          }
      }
  }
  
  override func viewDidLoad() {
      super.viewDidLoad()
      //Do any additional setup after loading the view, typically from a nib.
  }
}

我们导入了MobileCoreServices,用于设置数据类型。

在顶部StackView中,我们有两个UITextField。
我们将字符串从一个复制到另一个。
在中间StackView中,我们将URL从标签复制到另一个标签。

要将字符串转换为URL:URL(string:String)

反之亦然:URL.absoluteString

在中间StackView中,我们创建了一个名为Pasteboard。
值集的类型为kUTTypeURL。
我们将有效期设置为一个小时,并将粘贴板设置为" localOnly"。

在Bottom StackView中,我们使用pngData()复制图像,以从图像中获取Data实例,然后在Pasteboard实例的setData()中进行设置。
UIPasteboard.typeListImage用于检索粘贴板中所有类型的项目。