最近項目中康吵,用到了復(fù)制实夹,剪切的功能橄浓,這里記錄一下
系統(tǒng)自帶的input視圖的話,是默認(rèn)有這個功能的亮航,我們現(xiàn)在長按一個label荸实,來實現(xiàn)這個功能。
先說一下UIMenuController缴淋,這個就是長按之后准给,會彈出的那個黑黑的框泄朴,如圖
先在xib上創(chuàng)建一個label(這里就是copyNumberLabel),設(shè)置isUserInteractionEnabled為true露氮,下邊就直接上代碼
先創(chuàng)建一個長按手勢
let tap:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(showMenu(_:)))
copyNumberLabel.addGestureRecognizer(tap)
手勢方法實現(xiàn)
func showMenu(_ sender: UILongPressGestureRecognizer) {
if sender.state == .began {//判斷是手勢狀態(tài)祖灰,如果不寫,你會發(fā)現(xiàn)松開手勢之后還會再一次觸發(fā)這個方法
self.becomeFirstResponder()//這個必須寫畔规,不寫就不會顯示
menu = UIMenuController.shared
let item:UIMenuItem = UIMenuItem(title: "復(fù)制", action: #selector(copyText))//設(shè)置顯示的item
menu.menuItems = [item]
menu.setTargetRect((sender.view?.frame)!, in: self.view)
menu.setMenuVisible(true, animated: true)//顯示UIMenuController
}
}
接下來實現(xiàn)點擊item的實現(xiàn)方法
let original:String = copyNumberLabel.text!//原始字符串
let count = original.characters.count
let index = original.index(original.startIndex, offsetBy: count - 6)//把后邊6個字符串截取掉不要
let resultString = original.substring(to: index)//截取后的字符串
let board = UIPasteboard.general//系統(tǒng)的剪切板
board.string = resultString//系統(tǒng)的剪切板保存結(jié)果字符串(如果是截取圖片局扶,就設(shè)置board.image = 你的圖片)
這個時候你會發(fā)現(xiàn),點擊沒有出現(xiàn)那個黑黑的油讯,需要重寫系統(tǒng)的這個屬性的getter方法
override var canBecomeFirstResponder: Bool {
return true
}
到此详民,你以為就完結(jié)了?還有一個問題就是陌兑,你發(fā)現(xiàn)沈跨,第一次長按沒有反應(yīng),第二次會出現(xiàn)兔综,原因就是你沒有把UIMenuController的對象設(shè)為全局的饿凛,在類文件開始的地方設(shè)置為屬性就行了
var menu:UIMenuController!
另,這里實現(xiàn)的是copy软驰,如果想實現(xiàn)cut涧窒,我也只是一個設(shè)想,只需要在點擊item的那個方法里锭亏,把你label的text設(shè)置為空就可以了纠吴,變相的實現(xiàn)了剪切功能????。
--------------分割線---------------
如果你不滿足慧瘤,想要一個可以實現(xiàn)選擇范圍戴已,以及更多的功能,告訴你一個很厲害的方法锅减,用textfield代替label來顯示文本糖儡,長按,你會發(fā)現(xiàn)怔匣,功能很多哦握联。哈哈