UIMenuController ?是什么?
簡單來說 就是我們常看到的 ?Textfiled ?textView ?webView 上面 當(dāng)你 長按的時(shí)候 會有 彈出一長串 復(fù)制 粘粘 ?類似于 qq聊天 對應(yīng)的詳細(xì) 你查看的時(shí)候 會有復(fù)制 轉(zhuǎn)發(fā) 那個(gè) view.
好 先來 OC
1. 是 讓 添加 ?UIMenuController 的控件 成為 響應(yīng)者 *
- (BOOL)canBecomeFirstResponder{
returnYES;
}
2 重點(diǎn)來了 必須實(shí)現(xiàn)下面?zhèn)z方法 這倆方法 一般寫在?UIMenuController 創(chuàng)建的類 里面
- (BOOL)canBecomeFirstResponder{
? ? ? return YES;
}
//不要急 這個(gè)方法里面的 倆個(gè)selector 是 創(chuàng)建?UIMenuItem 的兩個(gè)方法 ?是 確保 這倆個(gè)方法 才會觸發(fā) ?能夠點(diǎn)擊 ?否則 ?其他的 都不觸發(fā)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if(action ==@selector(copy:) || action ==@selector(paste:) || action ==@selector(cut:)) {
? ? ? ? return YES;?
?}
? ? ? ? ? returnNO;
}
3. ?UIMenuController ?的創(chuàng)建
UIMenuController*menuVc = [UIMenuController sharedMenuController];
if(menuVc.isMenuVisible) {?
?[menuVc setMenuVisible:NO animated:YES];
?}
//self.frame 是你 需要添加 刪除 粘貼 ?UIMenuController 的控件的frame?self.superview 其父視圖的 frame
?[menuVc setTargetRect:self.frame inView:self.superview];
//使 ?UIMenuController 可見
?[menuVc setMenuVisible:YES animated:YES];
//自定義 的 item 就是 自定義 粘粘啊 刪除啊 還是 其他的item
UIMenuItem*item1 = [[UIMenuItem alloc] initWithTitle:@"item1"action:@selector(item1Click:)];
UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"item2"action:@selector(item2Click:)];?
//這個(gè)就是 把 item 放到 menuVC上
menuVc.menuItems = @[item1,item2];
最后 實(shí)現(xiàn)方法 menitems 方法就好了 方法里面 具體做什么 看自己業(yè)務(wù)?
注意 ?這個(gè)是 把 ?我們的 字符串 復(fù)制到 我們的硬件中 在其他地方可以粘粘
UIPasteboard*board = [UIPasteboardgeneral Pasteboard];
?board.string ="復(fù)制到手機(jī)硬件中";
綜上 ?oc的 代碼 ?封裝的 label
#import"LXBLabel.h"
@implementationLXBLabel
- (instancetype)initWithFrame:(CGRect)frame{
self= [superinitWithFrame:frame];
if(self) {
?[selfsetup]; }returnself;
}
- (void)awakeFromNib{ [selfsetup];
}
- (void)setup{
self.userInteractionEnabled =YES;
?[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickLabel)]];
}
- (void)clickLabel{?
[self becomeFirstResponder];
UIMenuController*menuVc =[UIMenuController ?sharedMenuController];// 控制好menu的顯示與隱藏UIMenuController*menuVc = [UIMenuController sharedMenuController];
if(menuVc.isMenuVisible) {?
?[menuVc setMenuVisible:NO animated:YES];?
?}
?[menuVc setTargetRect:self.frame inView:self.superview];
?[menuVc setMenuVisible:YES animated:YES];}
UIMenuItem*item1 = [[UIMenuItem alloc] initWithTitle:@"復(fù)制"action:@selector(copy:)];
UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"粘粘"action:@selector(paste:)];?
UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"剪貼"action:@selector(cut:)];
menuVc.menuItems = @[item1,item2];
- (BOOL)canBecomeFirstResponder{
// 明確該控件可以成為第一響應(yīng)者 returnYES;
}
// 該控件可以執(zhí)行哪些動作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if(action ==@selector(copy:) || action ==@selector(paste:) || action ==@selector(cut:)) {
returnYES;
?}
returnNO;
}
- (void)copy:(UIMenuController*)menu{
UIPasteboard*board = [UIPasteboardgeneral Pasteboard];?
?board.string =self.text;
?}
- (void)paste:(UIMenuController*)menu{
UIPasteboard*board = [UIPasteboardgeneral Pasteboard];
self.text = board.string;
}- (void)cut:(UIMenuController*)menu{
?[self copy:menu];
self.text =nil;
}
@end
swfit ?與 OC 類似 就是寫法 不同
```//
//? headerView.swift
//? MENEDEMO
//
//? Created by wwt on 2018/6/6.
//? Copyright ? 2018年 wwt. All rights reserved.
//
import UIKit
class headerView: UIView {
? ? var label :UILabel?
? ? override init(frame: CGRect) {
? ? ? ? super.init(frame: frame)
? ? ? ? label = UILabel.init(frame: CGRect.init(x: 5, y: 5, width: frame.width - 10, height: frame.height - 10))
? ? ? ? label?.text = "sadasdasdsad"
? ? ? ? label?.font = UIFont.systemFont(ofSize: 15)
? ? ? ? label?.textColor = UIColor.red
? ? ? ? label?.isUserInteractionEnabled = true
? ? ? ? let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
? ? ? ? lpgr.minimumPressDuration = 0.5
? ? ? ? label?.addGestureRecognizer(lpgr)
? ? ? ? self.becomeFirstResponder()
? ? ? ? addSubview(label!)
? ? }
? ? required init?(coder aDecoder: NSCoder) {
? ? ? ? fatalError("init(coder:) has not been implemented")
? ? }
? ? /*
? ? // Only override draw() if you perform custom drawing.
? ? // An empty implementation adversely affects performance during animation.
? ? override func draw(_ rect: CGRect) {
? ? ? ? // Drawing code
? ? }
? ? */
? ? public lazy var menuController: UIMenuController = {
? ? ? ? return UIMenuController.shared
? ? }()
? ? lazy var copyMenuItem: UIMenuItem = {
? ? ? ? return UIMenuItem(title:"復(fù)制", action:#selector(copyMenuAction))
? ? }()
? ? lazy var pasteMenuItem: UIMenuItem = {
? ? ? ? return UIMenuItem(title:"粘貼", action:#selector(pasteMenuAction))
? ? }()
}
extension headerView {
? ? override var canBecomeFirstResponder: Bool {
? ? ? ? return true
? ? }
? ? override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
? ? ? ? if [#selector(copyMenuAction), #selector(pasteMenuAction)].contains(action) {
? ? ? ? ? ? return true
? ? ? ? }
? ? ? ? return false
? ? }
? ? @objc func handleLongPress (_ recognizer: UILongPressGestureRecognizer){
? ? ? // if recognizer.state == .began {
? ? ? ? ? ? self.becomeFirstResponder()
? ? ? ? ? ? label?.becomeFirstResponder()
? ? ? ? ? ? menuController.menuItems = [copyMenuItem]
? ? ? ? ? ? menuController.setTargetRect((label?.frame)!, in: (label?.superview)!)
? ? ? ? ? ? menuController.setMenuVisible(true, animated: true)
? //? ? ? }
? ? }
? ? class func showAlert(_ t:String? = nil, message:String?,leftButtonTitle:String,rightButtonTitle:String? = nil, leftBtnSureClick:(() -> Void)? = nil, rightCancleBtnClick:(() -> Void)? = nil) {
? ? ? ? DispatchQueue.main.async(execute: { () -> Void in
? ? ? ? ? ? var title = t
? ? ? ? ? ? if title == nil {
? ? ? ? ? ? ? ? title = "";
? ? ? ? ? ? }
? ? ? ? ? ? let alertVC = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert);
? ? ? ? ? ? alertVC.addAction(UIAlertAction(title: leftButtonTitle, style: UIAlertActionStyle.default, handler: { (sure) -> Void in
? ? ? ? ? ? ? ? if leftBtnSureClick != nil {
? ? ? ? ? ? ? ? ? ? leftBtnSureClick!();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }))
? ? ? ? ? ? if rightButtonTitle != nil {
? ? ? ? ? ? ? ? alertVC.addAction(UIAlertAction(title: rightButtonTitle, style: UIAlertActionStyle.default, handler: { (cancle) -> Void in
? ? ? ? ? ? ? ? ? ? if rightCancleBtnClick != nil {
? ? ? ? ? ? ? ? ? ? ? ? rightCancleBtnClick!();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }))
? ? ? ? ? ? }
? ? ? ? ? ? let vc =? UIApplication.shared.keyWindow?.rootViewController;
? ? ? ? ? ? if vc != nil {
? ? ? ? ? ? }
? ? ? ? ? ? if ((vc?.presentedViewController) != nil) {
? ? ? ? ? ? ? ? vc?.presentedViewController!.present(alertVC, animated: true, completion: nil);
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? vc?.present(alertVC, animated: true, completion: nil);
? ? ? ? })
? ? }
? ? @objc func copyMenuAction() {
? ? ? ? headerView.showAlert("提示", message: "復(fù)制", leftButtonTitle: "是", rightButtonTitle: "否", leftBtnSureClick: {
? ? ? ? }) {
? ? ? ? }
? ? }
? ? @objc func pasteMenuAction (){
? ? ? headerView.showAlert(message: "提示", leftButtonTitle: "知道了")
? ? }
}