Sitemap
Molder

Molder

Pasteboard

9 min readApr 14, 2022

這次來做一下剪貼簿的功能,code很簡單,功用主要是將app裡面的文字或圖片長按複製,之後再貼到其他地方。例如備忘錄

限制:iOS 3以上 (基本無限制)

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
單行文字

實作(1)單行文字

UIPasteboard.general.string = "輸入想要複製的文字"
Press enter or click to view image in full size
Press enter or click to view image in full size
圖片

實作(2)圖片

UIPasteboard.general.image = "輸入你想要複製的 UIimage"
Press enter or click to view image in full size
Press enter or click to view image in full size
多行文字

實作(3)多行文字

UIPasteboard.general.strings = "輸入想複製的string array"
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Label 可支援 copy 文字功能

實作(4) Label 可支援 copy 文字功能

客製化Label

class CopyLabel: UILabel {  override init(frame: CGRect) {    super.init(frame: frame)    sharedInit()  }  required init?(coder aDecoder: NSCoder) {    super.init(coder: aDecoder)    sharedInit()  }  func sharedInit() {    isUserInteractionEnabled = true    addGestureRecognizer(UILongPressGestureRecognizer(target: self,    action: #selector(showMenu(_:))))  }  @objc func showMenu(_ sender: UILongPressGestureRecognizer) {    becomeFirstResponder()    let menu = UIMenuController.shared    if !menu.isMenuVisible {      menu.showMenu(from: self, rect: bounds)    }  }  override func copy(_ sender: Any?) {    UIPasteboard.general.string = text    UIMenuController.shared.hideMenu()  }  override var canBecomeFirstResponder: Bool {    return true  }  override func canPerformAction(_ action: Selector, withSender   sender: Any?) -> Bool {    if action == #selector(UIResponderStandardEditActions.copy(_:)) {        return true      }      return false  }}
Press enter or click to view image in full size
Press enter or click to view image in full size
ImageView 可支援 copy 圖片功能

實作(5) ImageView 可支援 copy 圖片功能

Get Molder’s stories in your inbox

Join Medium for free to get updates from this writer.

一樣客製化 ImageView

class CopyImageView: UIImageView {  override init(frame: CGRect) {    super.init(frame: frame)    sharedInit()  }  required init?(coder aDecoder: NSCoder) {    super.init(coder: aDecoder)    sharedInit()  }  func sharedInit() {    isUserInteractionEnabled = true    addGestureRecognizer(UILongPressGestureRecognizer(target: self,    action: #selector(showMenu(_:))))  }  @objc func showMenu(_ sender: UILongPressGestureRecognizer) {    becomeFirstResponder()    let menu = UIMenuController.shared    if !menu.isMenuVisible {      menu.showMenu(from: self, rect: bounds)    }  }  override func copy(_ sender: Any?) {    let tmpImage = self.image?.imageWithNewSize(size: CGSize(width: 1920, height: 1080))    guard let data = tmpImage?.compressImageMid(maxLength: 1920 * 1080), let newImage = UIImage(data: data) else { return }    UIPasteboard.general.image = newImage    UIMenuController.shared.hideMenu()  }  override func paste(_ sender: Any?)  {    self.image = UIPasteboard.general.image    UIMenuController.shared.hideMenu()  }  override var canBecomeFirstResponder: Bool {    return true  }  override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {  if action == #selector(UIResponderStandardEditActions.copy(_:)) &&  self.image != nil {    return true  } else if action ==  #selector(UIResponderStandardEditActions.paste(_:)) && self.image == nil {    return true  }    return false  }}
Press enter or click to view image in full size
Press enter or click to view image in full size
Tabele Cell 可支援 copy 文字功能

實作(6) Tabele Cell 可支援 copy 文字功能

將有 TableView 的 ViewController 裡多呼叫三個 UITableViewDelegate 的 func

  1. func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {}
  2. func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {}
  3. func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {}

在 performAction func 裡回傳 cell的資料給 UIPasteboard.general.string

func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {   UIPasteboard.general.string = strArr[indexPath.row]}

在 canPerformAction func 裡判斷支援哪種手勢事件,此範例只支援copy功能

func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {  if action == #selector(UIResponderStandardEditActions.copy(_:)) {    return true  }  return false}

在 shouldShowMenuForRowAt func 裡判斷是否允許顯示 UIMenuController ,此範例不限制哪個 cell,如果想限制哪幾個不行複製可在這設定。

func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {  return true}

--

--